同样的道理,在promise中,前面的代码片段会让foo()创建并返回一个Promise实例,而且在这个Promise会被传递到bar()和baz()中。所以本质上,promise就是某个函数返回的对象。你可以把回调函数绑定再这个对象上,而不是把回调函数当成参数传进函数。
const promise = doSomething();
promsie.then(successCallback,failureCallback){
}
当然啦,promise不像旧式函数将回调函数传递到两个处理函数中,而且会有一个优点:
在JavaScript事件队列的本次tick运行完成之前,回调函数永远不会执行。
通过.then形式添加的回调函数,甚至都在异步操作完成之后才被添加的函数,都会被调用。
通过多次调用.then,可以添加多个回调函数,他们会按照插入顺序并且独立运行。
但是,Promise最直接的好出就是链式调用。
doSomething().then(function(result) {
return doSomethingElse(result);
})
.then(function(newResult) {
return doThirdThing(newResult);
})
.then(function(finalResult) {
console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);
并且在一个失败操作之后还可以继续使用链式操作,即使链式中的一个动作失败之后还能有助于新的动作继续完成。
在调用Promise中的resolve()和reject()函数时如果带有参数,那么他们的参数会被传递给回调函数。
Promise.resolve()和Promise.reject()是手动创建一个已经resolve或者reject的promise快捷方法。通常,我们可以使用Promise.resolve()去链式调用一个由异步函数组成的数组。例如:
Promise.resolve().then(func1).then(func2);
Promise.all()和Promise。race()是并行运行异步操作的两个组合式工具。
Promise.then()方法用来分别指定resolved状态和rejected状态的回调函数。传递到then中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在JavaScript事件队列的所有运行结束了,事件队列被清空之后才开始执行
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// resolved
Promise.then()方法返回一个Promise,它最多需要有两个参数:Promise的成功和失败情况的回调函数。
p.then(onFulfilled, onRejected);
p.then(function(value) {
// fulfillment
}, function(reason) {
// rejection
});
onFulfilled:当Promise变成接受状态(fulfillment)时,该参数作为回调函数被调用。该函数有一个参数,即接受的值。
onRejected:当Promise变成拒绝状态时,该参数作为回调函数被调用。该函数有一个参数,即拒绝的原因。
Promise的状态一旦改变,就永久保持该状态,不会再改变了。
Promise中的错误处理一般的情况,我们会在每次的Promise中抛出错误,在Promise中的then函数中的rejected处理函数会被调用,这是我们作为错误处理的常用方法:
let p = new Promise(function(resolve,reject){
reject('error');
});
p.then(function(value){
success(value);
},function(error){
error(error)
}
)
但是一种更好的方式是使用catch函数,这样可以处理Promise内部发生的错误,catch方法返回的还是一个Promise对象,后边还可以接着调用then方法。而且catch方法尽量写在链式调用的最后一个,避免后边的then方法的错误无法捕获。