含义
Promise是异步编程的一种解决方案,用于一个异步操作的最终完成(或失败)及其结果值的表示,比传统的回调函数方案更加合理。
描述
1.Promise对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。
2.一个Promise有以下几种状态:
(1)pending:意味着操作正在进行。
(2)fulfilled:意味着操作成功。
(3)rejected:意味着操作失败。
3.pending状态的Promise对下那个可能触发fulfilled状态并传递一个值给相应的状态处理方法,也可能触发失败状态(rejected)并传递失败信息。当其中任何一种情况出现时,Promise对象的then方法绑定的处理方法(handlers)就会被调用(then方法包含两个参数:onfulfilled 和 onrejected (可选参数),它们都是Function类型。
语法:
var promise = new Promise((resolve,reject) => {
if(){ /*异步操作成功*/
resolve(value);
}else{
reject(error);
}
});
promise.then((value) => {
//success
},(error) => {
//failure
})
1.参数
executro函数在Promise构造函数执行时同步执行,被传递resolve和reject函数(executor函数在Promise构造函数返回新建对象前被调用)。
executor内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled(完成),或者将promise的状态改为rejected(失败)。
如果在executor函数中抛出一个错误,那么该promise状态改成rejected。executor函数的返回值被忽略。
2.简单使用
function timeout(ms){
return new Promise((resolve,reject) => {
setTimeout(resolve,ms,'done');
});
}
timeout(2000).then((value) => {
console.log(value); //done
});
细节
1.Promise对象在创建后立即执行,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行。
let promise = new Promise((resolve,reject) => {
console.log('Promise1');
resolve();
console.log('Promise2');
});
promise.then(() => {
console.log('resolved');
});
console.log('Hi!');
//Promise1
//Promise2
//Hi!
//resolved
2.如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;
resolve函数的参数除了正常的值以外,还可能是另一个Promise实例。
var p1 = new Promise((resolve,reject) => {
setTimeout(() => reject(new Error('fail')),3000)
})
var p2 = new Promise((resolve,reject) => {
setTimeout(() => resolve(p1), 1000)
})
p2.then(result => console.log(result)).catch(error => console.log(error))// Error: fail
如果p2的resolve方法将p1作为参数,p1的状态决定了p2的状态。如果p1的状态是pending,那么p2的回调函数将会等待到p1的状态改变;如果p1的状态已经是resolved或者rejected,那么p2的回调函数就会立即执行。
由于p2返回的是另一个Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。
注意:resolve函数传递不同参数生成Promise对象的不同情况可以参考Promise.resolve的用法。reject函数传递不同参数生成Promise对象的不同情况可以参考Promise.reject的用法。