ES6之promise

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const promise = new Promise(function(resolve, reject) {
// ... some code

if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});

//Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});

promise.then(function() {
console.log('resolved.');
});

console.log('Hi!');

// Promise
// Hi!
// resolved

用三个相互依赖的网络请求做例子,假如我们有三个网络请求,请求2必须依赖请求1的结果,请求3必须依赖请求2的结果,如果用回调的话会有三层,会陷入“回调地狱”,用Promise就清晰多了

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const request = require("request");

// 我们先用Promise包装下三个网络请求
// 请求成功时resolve这个Promise
const request1 = () => {
return new Promise((resolve, reject) => {
request('https://www.bai11du.com', function (error: any, response: { statusCode: number; }) {
if (!error && response.statusCode == 200) {
resolve('request1 success');
} else {
reject("123123")
}
});
});
}

const request2 = () => {
return new Promise((resolve, reject) => {
request('https://www.b3a11idu.com', function (error: any, response: { statusCode: number; }) {
if (!error && response.statusCode == 200) {
resolve('request2 success');
} else {
reject("22222")
}
});
});
}


const request3 = () => {
return new Promise((resolve, reject) => {
request('https://www.baidu221.com', function (error: any, response: { statusCode: number; }) {
if (!error && response.statusCode == 200) {
resolve('request3 success');
} else {
reject("3333")
}
});
});
}



// 先发起request1,等他resolve后再发起request2,
// 然后是request3
request1().then((data) => {
console.log(data);
return request2();
})
.then((data) => {
console.log(data);
return request3();
})
.then((data) => {
console.log(data);
})

request1().then((data) => {
console.log("11", data);
return request2()
}).catch(err => {
console.log("11", err)
})

then是可以链式调用的,后面的then可以拿到前面resolve出来的数据,

感谢你的打赏哦!