由于ie11不支持Promise,再加上以前没有认真地看过Promise的方法设计,所以我曾经为了解决异步回调嵌套的问题而制造了一些多余的轮子(比如nodejs异步回调的并发控制),现在看来这些东西完全可以用Promise来更好地解决,而且前人已经都解决了。。
Promise 的具体说明可以直接参考MDN上的实例代码。为了深刻的理解这些方法的使用,同时也为了能在ie上使用Promise来控制异步流程,我写了一个Promise的实现代码,用来证实我对规范中细节的理解。
需要注意的细节如下:#
- then方法返回的是距离当前位置最近的一个Promise或者thenable,因此链式调用时
a.then();a.then();
和a.then().then();
不一定是等价的 - Promise.resolve 和 Promise.reject 接受的参数可以是 value | thenable | Promise,value的情况下会直接把参数传递给then,而thenable或者Promise时,会把他们的处理结果传递给then
- then方法返回的是距离当前位置最近的一个Promise或者thenable,因此链式调用时
理解之后对下面的Promise异步队列执行逻辑就不会感到困惑了:
var r=function(a,e){
return new Promise(function(resolve,reject){
setTimeout(function(){
e?reject(e):resolve(a);
},500);
});
};
var s=function(a,e){
return function(x){
console.log(a,'=>',x);
return r(a,e);
};
};
console.log(' 1* 顺序队列');
Promise.reject(1).then(
null, s(2,null)
).then(
s(3,true), null
).then(
null, s(4,null)
).then(function(value){
console.log('>> completed: ',value);
console.log(' 2* 并发队列');
var o=[];
for(var i=0;i<3;i++)
for(var j=0;j<5;j++)
o[i]=(o[i]||Promise.resolve(j)).then(s(i,null));
});
实现代码: https://www.xdelve.com/resources/js_modules/polyfill/Promise.js
相关文档
暂无
随便看看
畅言模块加载中