ES6 promise小结

promise的三种状态

  • pending 进行中
  • fulfilled 已成功
  • rejected 已失败

基本用法

`

var promise = new Promise(function(resolve, reject) {
    if (true) {
        resolve(value);
    } else {
        reject(error);
    }
});

`

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”( pending —> resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
  • reject 函数的作用是,将Promise对象的状态从“未完成”变为“失败”( pending —> rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise.then(function(value) {
    // 异步操作成功后,调用resolve执行的回调函数
}, function(error) {
    // 异步操作失败后,调用reject执行的回调函数
});

第二个函数参数是可选的,不一定要提供。
因为Promise 新建后就会立即执行。所以用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数。.then函数也直接写在该函数之后

function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, 'done');
    })
}

timeout(100).then((value) => {
    console.log(value);
});

调用resolve函数和reject函数时可以带有参数,它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;resolve函数的参数除了正常的值以外,还可能是另一个 Promise 实例

在列出参数是一个Promise实例的例子前,务必记住下面这一点基础中的基础:

promise是一个实例对象,有三种状态 —— pending fulfilled rejected

var p1 = new Promise(function (resolve, reject) {
  setTimeout(() => reject(new Error('fail')), 3000)
})

var p2 = new Promise(function (resolve, reject) {
  setTimeout(() => resolve(p1), 1000)
})

p2
  .then(result => console.log(result))
  .catch(error => console.log(error))
// Error: fail

上面代码中,p1是一个Promise,3秒之后变为rejected。p2的状态在1秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对后者(p1)。又过了2秒,p1变为rejected,导致触发catch方法指定的回调函数。

注意,调用resolve或reject并不会终结 Promise 的参数函数的执行。

 JavaScript Function.apply() 函数详解
Angularjs中的事件广播 —$broadcast,$emit,$on 
上一篇:JavaScript Function.apply() 函数详解
下一篇:Angularjs中的事件广播 —$broadcast,$emit,$on


如果我的文章对你有帮助,或许可以打赏一下呀!

支付宝
微信
QQ