You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
doSomething(function(result){doSomethingElse(result,function(newResult){doThirdThing(newResult,function(finalResult){console.log('Got the final result: '+finalResult);},failureCallback);},failureCallback);},failureCallback);
doSomething().then(function(result){returndoSomethingElse(result);}).then(function(newResult){returndoThirdThing(newResult);}).then(function(finalResult){console.log('Got the final result: '+finalResult);}).catch(failureCallback);
利用箭头函数arrow function,代码还能进一步简化:
doSomething().then(result=>doSomethingElse(result)).then(newResult=>doThirdThing(newResult)).then(finalResult=>{console.log(`Got the final result: ${finalResult}`);}).catch(failureCallback);
varp1=newPromise(function(resolve,reject){setTimeout(resolve,500,"one");});varp2=newPromise(function(resolve,reject){setTimeout(resolve,100,"two");});Promise.race([p1,p2]).then(function(value){console.log(value);// "two"// Both resolve, but p2 is faster});varp3=newPromise(function(resolve,reject){setTimeout(resolve,500,"three");});varp4=newPromise(function(resolve,reject){setTimeout(reject,100,"four");});Promise.race([p3,p4]).then(function(value){// not called},function(reason){console.log(reason);// "four"// p4 is faster, so it rejects});
Promise
动机
JavaScript生来是一个单线程的语言,当我们想要做异步操作时,就不可避免用到回调函数。
回调函数很容易变成回调地狱,比如:
这样的写法既复杂又不能很好的handle error。
于是在ES6中就引入了Promise这个概念,利用Promise,上面的代码就可以写成这样:
利用箭头函数
arrow function
,代码还能进一步简化:状态机
Promise背后的核心思想是一个Promise代表一个异步操作的结果。
本质上,Promise就是一个状态机
state machine
。它有三种状态:下图就是这个状态机的状态转换图:
下面我们就可以开始实现Promise了:
状态转换
我们先来实现两个关键的状态转换:实现
fulfill
和拒绝reject
这样我们就有了两个比较基本的状态转换,我们来看看更高级的状态转换:解决
resolve
怎么实现:这边要注意resolve是怎么接收一个Promise和一个value的。如果接收的是Promise,就要等待它完成。
在代码中我们用到了几个辅助函数,我们来定义一下:
构造
至此,我们已经完成了这个状态机,但我们还没有实现解决Promise和观察Promise的函数。
我们先来加个解决Promise的方法:
我们保证Promise只被resolve或reject一次,然后再也不会再转换到不同的状态了。
观察(通过
.done
)我们现在有了一个完整的状态机,但我们还是没有任何方法可以去观察它的变化。
我们的最终目标是要实现
.then
,但.done
更容易实现,我们先来实现它。观察(通过
.then
)现在我们已经有了
.done
,我们就可以很容易的实现.then
,我们在这个过程中要构造一个新的Promise,因为.then
会返回一个Promise。有了Promise.then,其他像Promise.resolve,Promise.reject,Promise.race, Promise.all就很好实现了。
Promise.resolve(value)
返回一个以给定值解析后的promise对象。如果传入的value本身就是promise对象,则该对象作为Promise.resolve方法的返回值返回;否则以该值为成功状态返回promise对象。
实现
例子
Promise.reject(reason)
返回一个带有拒绝原因reason参数的promise对象。
实现
例子
Promise.race(iterable)
返回一个promise,一旦迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝。
实现
例子
Promise.all(iterable)
返回一个Promise实例,此实例在iterable参数内所有的promise都resolved或参数中不包含promise时 resolve;如果参数中promise有一个rejected,此实例reject,失败原因是第一个失败promise的结果。
实现
例子
参考资料
The text was updated successfully, but these errors were encountered: