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(); //开始调用函数
关键词: async 和 await
异步函数 async function 中可以使用 await 指令,await 指令后必须跟着一个 Promise,异步函数会在这个 Promise 运行中暂停,直到其运行结束再继续运行。