分享一下自己解决异步的轮子shy-Do
发布于 7 年前 作者 shynome 3522 次浏览 最后一次编辑是 6 年前 来自 分享

github地址在这 重写一个单页应用的时候,看到各种嵌套之后决定把它们抹平,就写了这个轮子 一开始只有三个api

	Do
.done(fucntion(val){
//do something
return val
})
.wait(function(val,rl){
//do something
rl(val)
})
.catch(function(err){
console.log(err)
throw err
})
.done().....

后面又需要一个插件的值才能进行下一步

.wait(function(val,rl){
	require.async(plugIn,rl)
})

觉得这样写有点麻烦就又加了个APIresultwait搭配使用:

var plugIn = Do.wait(function(val,rl){
	require.async(plugIn,rl)
});
________________
.wait( plugIn.result )
.done(function(res){
//do something with res
})

后面又需要等待jQuery的插件加载完成后才能进行下一步

.wait(function(val,rl){
	require.async(plugIn2,function(){
	rl(val)
	})
})

这样也是挺麻烦的,就又加了个APIdepend:

var plugIn2 = Do.wait(function(val,rl){
	require.async(plugIn2,rl)
});
________________
.depend( plugIn2 )
.done(function(val){
//do something with val
return val
})

其实这个改改也是可以当做Promise兼容库的,但是为了书写更方便选择了不和Promise兼容,所以Promise中的all之类的静态方法没有去实现.

	var Promise =function(func){
		return Do.wait(function(val,rl,rj){
			func(rl,rj)
		})
	}
	var p1 = new Promise(function(rl,rj){
		setTimeout(function(){
			rl(1)
		},2000)
	})
	var p2 = p1
	.then(function(val){
		console.log(val)
		return ++val
	})
	.then(function(val){
		console.log(val)
	})

并且这个的速度比native-promise-only的速度快很多,和原生的Promise不相上下,但是当.then的链式调用的数目超过最大回调嵌套数就出错了,而native-promise-only不会,分享出来就是想解决这个问题的

7 回复

和 Promise 好像…

没看过 Promise 做出来的?orz

@coderfox 我在node上也是使用Promise的,然而浏览器没有全面支持Promise,所以造了个和PromiseAPI基本一致的轮子,在性能上也是接近原生Promise的.

没promise,profill不就好了

来自酷炫的 CNodeMD

@iyuq 那我为什么不造个promise的polyfill呢?

polyfill…

来自酷炫的 CNodeMD

@shynome 既然你造的和github上已有的差别不大,出于学习你可以自己造,但是用于项目还是用标准

回到顶部