您的位置:首页 > 大数据 > 人工智能

Promise 在ECMA7中的简化async和await

2019-02-15 15:38 369 查看

什么是Promise

ES6规定,Promise 对象是一个构造函数,用来生成Promise实例
Promise 对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。

因此Promise 有两个参数resolve 、reject
resolve 当程序运行成功,调用该函数 (.then中传入的函数)
reject 当程序运行失败,调用该函数 (.catch中传入的函数)
【注】一个new Promise 后面只能跟一个.then方法。

/*
假设
stauts  1  程序运行成功
stauts  0  程序运行失败
*/
var stauts = 0;

new Promise(function(resolve, reject){
console.log("程序开始运行");
if(stauts == 1){
resolve("success");
}else{
reject("error");
}
}).then(function(value){
console.log(value + ", then");
}).catch(function(value){
console.log(value + ", catch");
})

当 status = 0时,执行的是.catch传入的函数。(执行失败)
当 status = 1时,执行的是.then传入的函数。(执行成功)

ECMA7中的Promise (async和await)

async 异步 【注】声明异步函数

async function waibai(){
return "吃外卖";
}
var result = waibai();
// console.log(result);
result.then(function(value){
console.log(value);
})

console.log(result)输出的是一个Promise 对象,所以在最外层不能用 await 获取其返回值的情况下,我们当然应该用原来的方式:then() 链来处理这个 Promise 对象。
我们可以看出console.log(result)和 waibai()函数是异步执行的。

await 异步等待 , 用于等待一个异步方法执行完成 【注】一定不能直接调用 ,await 必须在异步声明的函数里

一般来说,都认为 await 是在等待一个 async 函数完成。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。

如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到resolve 的值,作为 await 表达式的运算结果。

看到上面的阻塞一词,心慌了吧……放心,这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。

async function waimai(){
//中间过程是拿外卖,拿外卖的过程交给下面show函数,异步执行
return "吃上外卖";
}

async function show(){
var result = await waimai();
console.log(result);
}
show();

如果await 不在异步声明的函数里,那么久会引起主程序卡顿错误。
即:

async function waimai(){
//中间过程是拿外卖
return "吃上外卖";
}
var result = await waimai();
console.log(result)

//SyntaxError: await is only valid in async functions and async generators 04异步等待.html:11:16
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: