ES6 标准化并引入了 Promise 对象,这是一种异步编程的解决方案。简单的说,就是用同步的方式写异步代码,可以用来解决回调地狱问题。
Promise对象的状态一旦改变,就不会再改变,只有两种可能的改变。
- 由待定改为已解决。
- 由Pending改为Rejected。
使用 setTimeout 来模拟异步操作
function newAsync(){
return new Promise((resolve) => {
setTimeout(() => reslove(n + 500), n)
})
}
function fn1(n) {
console.log(`step1 ${n}`);
return newAsync(n);
}
function fn2(n) {
console.log(`step2 ${n}`);
return newAsync(n);
}
function fn3(n) {
console.log(`step3 ${n}`);
return newAsync(n);
}
使用promise来实现
function fn() {
let time1 = 0;
fn1(time1)
.then((time2) => fn2(time2))
.then((time3) => fn3(time3))
.then((res) => {
console.log(`result ${res}`);
});
}
fn();
Promise 优点和缺点
优点:Promise以同步的方式编写异步代码,避免了回调函数层层嵌套,可读性更强。链式操作,可以在then中继续写Promise对象并return,然后继续调用then进行回调操作。
缺点:Promise对象一旦创建就会立即执行,不能中途取消。如果没有设置回调函数,Promise 会在内部抛出错误,不会向外流。