CNode

分享一下自己解决异步的轮子shy-Do

分享
Sshynome发布于10 年前最后回复10 年前7 回复4845 浏览0 收藏

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)

C
coderfox#1·10 年前

和 Promise 好像…

没看过 Promise 做出来的?orz

S
shynome#2·10 年前
引用 coderfox和 Promise 好像… 没看过 Promise 做出来的?orz

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

I
iyuq#3·10 年前

没promise,profill不就好了

来自酷炫的 CNodeMD

S
shynome#4·10 年前
引用 iyuq没promise,profill不就好了 来自酷炫的 CNodeMD

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

K
Kaijun#5·10 年前

polyfill...

来自酷炫的 CNodeMD

I
iyuq#6·10 年前

@Kaijun 哈哈

I
iyuq#7·10 年前

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

参与回复
登录后即可参与回复。登录