promise

Promise

  • Promise状态一旦改变就不会再变;
  • Promise函数两个参数(resolve,reject)
  • Promise在创建之后会立即执行
  • resolve之后的代码还会运行,但是reject跑出的错误不会运行
  • Promise错误会向后继续跑出知道被catch捕获为止,建议使用catch捕获异常而不是在then的第二个参数reject处理,如果使用reject捕获不处理,不加reject处理的话外层不会处理里面抛出的异常, then是链式运行,就是同步运行,catch最好放在最后捕获异常,如果放在中间有可能跳过异常而没有捕获到后面的异常
  • Promise.all,可以将多个Promise包装成一个新的Promise实例,all方法中,只有每一个参数promise都变成fulfilled,新建的Promise才会变成Fulfilled,如果有一个是reject,那么新的Promise对象的参数就是第一个reject传回来的回调函数
  • Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为Promise内部的错误不会冒泡到全局)。
  • 因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。
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
64
65
66
67
var getJSON = function(url) {
var promise = new Promise(function(resolve, reject) {
var client = new XMLHttpRequest();
client.open('GET', url);
client.onreadystatechange = handler;
client.responseType = 'json';
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
resolve(this.response);
} else {
resolve(new Error(this.statusText));
}
};
});
return promise;
};
getJSON('/posts.json').then(function(json) {
console.log('Contents:', json);
}, function(error) {
console.log(error);
});
// image load
const preloadImage = function(path) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.onload = resolve;
image.onerror = reject;
image.src = path;
});
};
// load image Sync
function loadImageAsync(url) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.onload = function() {
resolve(image);
};
image.onerror = function() {
reject(new Error('can not load image'));
};
image.src = url;
});
};
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// Error: 报错了
坚持原创技术分享,您的支持将鼓励我继续创作!