js0021

深入研究promise的执行顺序

promise 作为用于异步任务对象的占位符 代表了一个我们还未获得但是在未来有希望获得的值

基于这个原因 对象从等待状态开始 此时对承诺的值 一无所知

promise 的 resolve 函数 被调用的时候 会进入完成状态 fulfilled 状态

如果是reject 函数被调用 状态不能再进行切换了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>A closer look at promise order of execution</title>
<link rel="stylesheet" href="../assert.css">
<script src="../assert.js"></script>
</head>
<body>
<script>
"use script";

report("At code start");

const ninjaDelayedPromise = new Promise((resolve, reject) => {
report("ninjaDelayedPromise executor");
setTimeout(() => {
report("Resolving ninjaDelayedPromise");
resolve("Hatori");
}, 500);
});

assert(ninjaDelayedPromise !== null, "After creating ninjaDelayedPromise");

ninjaDelayedPromise.then(ninja => {
assert(ninja === "Hatori",
"ninjaDelayedPromise resolve handled with Hatori");
});

const ninjaImmediatePromise = new Promise((resolve, reject) => {
report("ninjaImmediatePromise executor. Immediate resolve.");
resolve("Yoshi");
});

ninjaImmediatePromise.then(ninja => {
assert(ninja === "Yoshi",
"ninjaImmediatePromise resolve handled with Yoshi");
});

report("At code end");
</script>
</body>
</html>