Promise

概述

1
2
3
4
5
6
7
8
9
10
11
12
// 延迟2s输出1,完了之后延迟1s输出2,完了之后之后延迟1s输出3
setTimeout(() => {
console.log('1')
}, 3000)

setTimeout(() => {
console.log('2')
}, 1000)

setTimeout(() => {
console.log('3')
}, 1000)

我们发现这几个setTimeout函数不是串行执行的,而是并行进行的。

  • 同步代码:串行执行,前面的代码先执行,后面的代码后执行。
  • 异步代码:并行执行,同时开始执行,后面的代码不会等待前面的代码执行完毕再执行。

正确写法:嵌套递归的写法

1
2
3
4
5
6
7
8
9
setTimeout(() => {
console.log('1')
setTimeout(() => {
console.log('2')
setTimeout(() => {
console.log('3')
}, 1000)
}, 1000)
}, 3000)

js把这个现象叫做回调地狱即回调函数的嵌套

Promise是一个类,用来包装异步操作,根据异步操作的结果,是成功还是失败,进而决定Promise是成功还是失败;Promise支持链式调用,从而消除回调地狱。

Promise 是一种用于处理异步操作的对象。它代表了一个最终可能完成(并传递一个结果值)或失败(并传递一个原因)的异步操作。Promise 允许你为异步操作的成功和失败分别指定处理函数(handlers),并且可以在这些操作完成时得到相应的通知。

基本用法

创建一个 Promise 的基本方式是使用 new Promise(executor) 构造函数,其中 executor 是一个接收两个函数的函数:resolvereject。这两个函数由 JavaScript 引擎提供,分别用于在异步操作成功时和失败时调用。两个函数不可能会同时执行,要么成功,要么失败。

Promise 有三种状态:

  1. Pending(等待):初始状态,既不是成功,也不是失败状态。
  2. Fulfilled(已兑现):意味着操作成功完成。
  3. Rejected(已拒绝):意味着操作失败。

一旦 Promise 被兑现(fulfilled)或拒绝(rejected),它的状态就不能再改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let promise = new Promise(function(resolve, reject) {
let success = true;
if (success) {
resolve("操作成功");
} else {
reject("操作失败");
}
});

promise.then(
(message) => {
console.log('success!', message)
},
(error) => {
console.log('fail!', error)
}
);

链式调用

Promise 的一个关键特性是支持链式调用chaining。每个 then 方法可以返回一个新的 Promise,从而可以基于这个返回值继续链式调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function delay(duration, n) 
{
return new Promise((resolve) =>
{
setTimeout(() =>
{
resolve(n)
}, duration)
})
}

delay(2000, 1).then((n1) => {
console.log(n1)
return delay(1000, 2)
}).then((n2) => {
console.log(n2)
return delay(1000, 3)
}).then((n3) => {
console.log(n3)
})