JavaScript Promise 对象

167 阅读3分钟

Promise

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。

Promise 构造函数只有一个参数,是一个函数,这个函数在构造之后会直接被异步运行,我们称之为起始函数。起始函数包含两个参数 resolve 和 reject。resolve 和 reject 都是函数,其中调用 resolve 代表一切正常,reject 是出现异常时所调用的。

英文翻译: resolve (决定) reject(拒绝)

var myPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,才会调用resolve(...), 当异步代码失败时就会调用reject(...)
    //在本例中,使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
    setTimeout(function(){
        resolve("成功!"); //代码正常执行!
    }, 1000);
});
myPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值.
    //successMessage参数不一定非要是字符串类型,这里只是举个例子
    document.write("Yay! " + successMessage+'<br/>');
    // return 333;     //return 333 时还会继续执行下一个.then
     throw "An error";
}).then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值.
    //successMessage参数不一定非要是字符串类型,这里只是举个例子
    document.write("Yay! " + 333+'<br/>');
}).catch((message)=>{
    document.write("err! " + message+'<br/>');
})
//以上代码执行完成,界面会出现:Yay! 成功!err! An error(因为用的document.write()方法直接写到浏览器页面上)

![U9GB1AEK8YI6`]%5F$TCROL.png](p6-juejin.byteimg.com/tos-cn-i-k3…?)

注意一下:

  • resolve 和 reject 的作用域只有起始函数,不包括 then 和 catch;
  • resolve 和 reject 并不能够使起始函数停止运行,需要使用 return。在 then 里可以调用 return 来继续往下一个 then 走,但是在起始函数里调用 return 就不会执行任何 then 了。

Promise.all方法,Promise.race方法

Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。多个实例全部成功才算成功,只要有一个失败,就算失败。

var p = Promise.all([p1,p2,p3]);
//(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。)

Promise.race 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。最终的状态取决于p1,p2,p3谁先修改状态,则最终状态就是谁的状态

var p = Promise.race([p1,p2,p3]);
//只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的返回值。

Promise.resolve 方法,Promise.reject 方法

这两个方法都可以将现有对象转为Promise对象。

var p = Promise.resolve('Hello'); 
p.then(function (s){ 
    console.log(s) 
}); 
// 结果在控制台输出 Hello
//'Hello原本不是 Promise 对象,但是调用 Promise.resolve('Hello') 将其转换成为一个 Promise 对象,所以有了 then方法

var p = Promise.reject('出错了'); 
p.then(null, function (s){ 
    console.log(s) 
}); 
//结果在控制台输出  出错了

注意: Promise.resolve()和Promise.reject()后都是调用的 then ,而不是 catch。 Promise.reject().then(null,()=>{})的第一个参数是null,第二个才是呗拒绝要执行的回调。

异步函数

async function asyncFunc() { 
    try { 
        await new Promise(function (resolve, reject) {});
        await new Promise(function (resolve, reject) {});
        await new Promise(function (resolve, reject) {});
        //可以保证多个 Promise 按顺序执行
    }catch(){
        
    };
asyncFunc();  //开始调用函数

关键词: asyncawait

异步函数 async function 中可以使用 await 指令,await 指令后必须跟着一个 Promise,异步函数会在这个 Promise 运行中暂停,直到其运行结束再继续运行。