宣布自
Kindem的博客,迎接人人转载,然则要注意说明出处。别的,该文章收纳在
Kindem的个人的 IT 学问整顿堆栈,迎接 Star、Fork、投稿
Promise
因为JavaScript
是单线程的,所以回调是JavaScript
中避免不了的,一切的收集要求、浏览器事宜都须要运用回调的体式格局异步处置惩罚。
一旦要求、事宜多了,就避免不了回调地狱
,回调极可能轻易一层接着一层。
Promise
的意义是许诺,作用和回调函数类似,在将来的某个时候实行某件事变。然则Promise
的写法越发简约易用,越发相符我们寻常的头脑。
Usage
Promise
是一个对象,在ES6已被范例成了原生JavaScript
的一部分,然则在ES6之前,则须要运用第三方库来完成
Promise
分为三个状况:
-
pending
: 实行中 -
resolved
: 已完成 -
rejected
: 已失利
Promise
对象被实例化的那一刻,传入组织函数的要领将会被实行,而且进入pending
状况,而一旦完成或许失利,则会进入响应的状况,这一历程是不可逆的
他的用法(ES6)以下:
let promise = new Promise((resolve, reject) => {
if (...) {
// 假如胜利了
resolve(...);
} else {
// 假如失利了
reject(...);
}
});
这里的resolve
和reject
两个要领可以运用下面的要领来授与:
promise
.then(onSuccess)
.catch(onFailed);
传递给then
的要领将在许诺实行胜利时被挪用,传递给catch
的要领将在许诺实行失利时被挪用
越发轻易的一点是,Promise
每每可以嵌套运用,如许可以是多个使命井井有条地举行,假定p1
是一个Promise
对象而p2
、p3
都是可以发生Promise
对象的要领(假如直接new
那末Promise
将会被直接实行),那末你可以如许写,使得他们根据递次实行,而且可以一次性处置惩罚他们发生的毛病
p1
.then(p2)
.then(p3)
.then(onSuccess)
.catch(onFailed);
比方:
let p1 = new Promise((resolve, reject) => {
console.log('p1');
setTimeout(() => {
resolve('p2');
}, 1000)
});
let p2 = (result) => new Promise((resolve, reject) => {
console.log(result);
setTimeout(() => {
resolve('p3');
}, 2000);
});
let p3 = (result) => new Promise((resolve, reject) => {
console.log(result);
setTimeout(() => {
resolve('over');
}, 3000);
});
p1
.then(p2)
.then(p3)
.then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});
运转可以瞥见:
p1
p2
p3
over