1、Promise
Promise是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型 )。
Promise是一个构造函数,其原型上有then、catch、finally方法,对象上有reject、resolve方法。
- resolve:异步操作执行 "成功" 后的回调函数
- reject:异步操作执行 "失败" 后的回调函数
- then:当上面的resolve函数时回调
- catch:当上面执行reject函数时回调
- finally:finally在最后总会执行
function getName() {
let p = new Promise(function(resolve, reject) {
setTimeout(function() {
let x = Math.random();
if (x >= 0.5) {
//转为成功状态
resolve("成功了");
} else {
//转为失败状态
reject("失败了");
}
}, 1000);
})
return p;
}
function test() {
let p = getName();
p.then(function(data) { //监听成功状态
console.log("成功", data);
}).catch(function(e) { //监听失败状态
console.log("失败", e);
}).finally(function() {
console.log("end...");
});
}
test();
pormise链式操作用法:
从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:
function tool(arg) {
let p = new Promise(function(resolve, reject) {
resolve(arg + 10)
});
return p;
}
tool(10).then((data) => {
console.log(data); //20
return tool(data);
}).then((data) => {
console.log(data); //30
return tool(data);
}).then((data) => {
console.log(data); //40
})
then方法的返回值:如果then方法调用时传入的函数的返回值是一个Promise对象,它的返回值就是这个Promise对象, 如果then方法调用时传入的函数的返回值不是一个Promise对象,它的返回值就是一个新的Promise对象并且包装了,then方法调用时传入的函数的返回值 。
2、Async和await
Promise的链式操作其实已经实现的很好了,但是为了体现编程的最高思想,高内聚低耦合,解决异步代码的嵌套问题,我们可以用到async方法和await方法。
函数使用async修饰,该函数中可以使用await修改一个函数调用语法,被调用的函数可以 是一个Promise的值。
async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
function tool(arg) {
let p = new Promise(function(resolve, reject) {
resolve(arg + 10)
});
return p;
}
async function test() {
let re = await tool(10);
console.log(re); //20
let re2 = await tool(re);
console.log(re2); //30
let re3 = await tool(re2);
console.log(re3); //40
}
test();