• ES6-10(ES6Promise )


    Promise

    ES5中为了保证代码顺序执行异步操作不停的加回调代码阅读性很差,体验也不好

    Promise Syntax

    Promise 就是为了解决“回调地狱”问题的

    function loadScript (src) {
      return new Promise((resolve, reject) => {
        let script = document.createElement('script')
        script.src = src
        script.onload = () => resolve(script)
        script.onerror = (err) => reject(err)
        document.head.append(script)
      })
    }
    
    loadScript('1.js')
    .then(() => loadScript('2.js'), (err) => {
    console.log(err)
    })
    .then(() => loadScript('3.js'), (err) => {
    console.log(err)
    })
    

    基本语法

    new Promise( function(resolve, reject) {…} );
    

    通过创建 Promise 对象开启一个异步操作的过程,一般用几步完成多次异步操作:

    1. new Promise(fn) 返回一个Promise 对象
    2. 在fn 中指定异步等处理
    3. 处理结果正常的话,调用resolve(处理结果值)
    4. 处理结果错误的话,调用reject(Error对象)
    var promise = new Promise(function (resolve, reject) {
      resolve('传递给then的值')
    })
    promise.then(function (value) {
      console.log(value)
    }, function (error) {
      console.error(error)
    })
    

    这段代码创建一个 Promise 对象,定义了处理 onFulfilled 和 onRejected 的函数(handler),然后返回这个 Promise 对象。

    这个 Promise 对象会在变为 resolve 或者 reject 的时候分别调用相应注册的回调函数。

    • 当 handler 返回一个正常值的时候,这个值会传递给 Promise 对象的 onFulfilled 方法。
    • 定义的 handler 中产生异常的时候,这个值则会传递给 Promise 对象的 onRejected 方法。

    Promise.prototype.then()

    p.then(onFulfilled[, onRejected]);
    
    p.then(value => {
      // fulfillment
    }, reason => {
      // rejection
    });
    

    返回值

    返回值不符合要求,就会生成一个空得promise对象向下继续传递

    • 返回了一个值,那么 then 返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
    • 没有返回任何值,那么 then 返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined
    • 抛出一个错误,那么 then 返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
    • 返回一个已经是接受状态的 Promise,那么 then 返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
    • 返回一个已经是拒绝状态的 Promise,那么 then 返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
    • 返回一个未定状态(pending)的 Promise,那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的

    链式调用

    then 方法返回一个 Promise 对象,其允许方法链。

    你可以传递一个匿名函数给 then,并且,如果它返回一个 Promise,一个等价的 Promise 将暴露给后续的方法链。下面的代码片段使用 setTimout 函数来模拟异步代码操作。

    Promise.resolve("foo")
      // 1. 接收 "foo" 并与 "bar" 拼接,并将其结果做为下一个 resolve 返回。
      .then(function(string) {
        return new Promise(function(resolve, reject) {
          setTimeout(function() {
            string += 'bar';
            resolve(string);
          }, 1);
        });
      })
      // 2. 接收 "foobar", 放入一个异步函数中处理该字符串
      // 并将其打印到控制台中, 但是不将处理后的字符串返回到下一个。
      .then(function(string) {
        setTimeout(function() {
          string += 'baz';
          console.log(string);
        }, 1)
        return string;
      })
      // 3. 打印本节中代码将如何运行的帮助消息,
      // 字符串实际上是由上一个回调函数之前的那块异步代码处理的。
      .then(function(string) {
        console.log("Last Then:  oops... didn't bother to instantiate and return " +
                    "a promise in the prior then so the sequence may be a bit " +
                    "surprising");
    
        // 注意 `string` 这时不会存在 'baz'。
        // 因为这是发生在我们通过setTimeout模拟的异步函数中。
        console.log(string);
      });
    
    // logs, in order:
    // Last Then: oops... didn't bother to instantiate and return a promise in the prior then so the sequence may be a bit surprising
    // foobar
    // foobarbaz
    

    Promise.resolve()

    一般情况下我们都会使用 new Promise() 来创建 Promise 对象,但是除此之外我们也可以使用其他方法。

    在这里,我们将会学习如何使用 Promise.resolve 和 Promise.reject 这两个方法。

    静态方法 Promise.resolve(value) 可以认为是 new Promise() 方法的快捷方式。

    比如 Promise.resolve(42) 可以认为是以下代码的语法糖。

    new Promise(function (resolve) {
      resolve(42)
    })
    

    在这段代码中的 resolve(42) 会让这个 Promise 对象立即进入确定(即resolved)状态,并将 42 传递给后面 then 里所指定的 onFulfilled 函数。

    方法 Promise.resolve(value) 的返回值也是一个 Promise 对象,所以我们可以像下面那样接着对其返回值进行 .then 调用。

    Promise.resolve(42).then(function (value) {
      console.log(value)
    })
    

    Promise.reject()

    Promise.reject(error) 是和 Promise.resolve(value) 类似的静态方法,是 new Promise() 方法的快捷方式。

    比如 Promise.reject(new Error(“出错了”)) 就是下面代码的语法糖形式。

    new Promise(function (resolve, reject) {
      reject(new Error('出错了'))
    })
    

    这段代码的功能是调用该Promise 对象通过then指定的 onRejected 函数,并将错误(Error)对象传递给这个 onRejected 函数。

    Promise.reject(new Error('BOOM!'))
    
    Promise.prototype.catch()
    function test () {
      return new Promise((resolve, reject) => {
        reject(new Error('es'))
      })
    }
    
    test().catch((e) => {
      console.log(e.message) // es
    })
    

    不建议在 Promise 内部使用 throw 来触发异常,而是使用 reject(new Error()) 的方式来做,因为 throw 的方式并没有改变 Pronise 的状态

    Promise.all()

    var p1 = Promise.resolve(1)
    var p2 = Promise.resolve(2)
    var p3 = Promise.resolve(3)
    Promise.all([p1, p2, p3]).then(function (results) {
      console.log(results) // [1, 2, 3]
    })
    

    Promise.all 生成并返回一个新的 Promise 对象,所以它可以使用 Promise 实例的所有方法。参数传递promise数组中所有的 Promise 对象都变为resolve的时候,该方法才会返回, 新创建的 Promise 则会使用这些 promise 的值。

    如果参数中的任何一个promise为reject的话,则整个Promise.all调用会立即终止,并返回一个reject的新的 Promise 对象。

    由于参数数组中的每个元素都是由 Promise.resolve 包装(wrap)的,所以Paomise.all 可以处理不同类型的 promose对象。

    Promise.race()

    var p1 = Promise.resolve(1)
    var p2 = Promise.resolve(2)
    var p3 = Promise.resolve(3)
    Promise.race([p1, p2, p3]).then(function (value) {
      console.log(value) // 1
    })
    

    Promise.race 生成并返回一个新的 Promise 对象。

    参数 promise 数组中的任何一个 Promise 对象如果变为 resolve 或者 reject 的话, 该函数就会返回,并使用这个 Promise 对象的值进行 resolve 或者 reject。

  • 相关阅读:
    perl学习笔记三
    linux下编译C/C++
    redis学习笔记——数据类型
    redis学习笔记二
    perl学习笔记二
    hadoop实战 -- 网站日志KPI指标分析
    Java反射与动态代理
    使用maven来管理您的java项目
    使用MapReduce实现一些经典的案例
    编译本地64位版本的hadoop-2.6.0
  • 原文地址:https://www.cnblogs.com/xingchenhuanqi/p/13173716.html
Copyright © 2020-2023  润新知