2014-06-12 83 views
0

我发现自己发明了一种使用jQuery承诺的模式,并想知道自己是否已经存在于其他地方。链接jQuery承诺通过回调

基本上,我有一个需要一个接一个地发生的异步操作链 - 但它们不一定是所有相同的操作,这些操作可能是有条件的。

它可能看起来像这样(CoffeeScript的语法简洁):

a = itemA.save() 
a.done -> 
    b = itemB.fetch() 
    b.done -> 
    if x 
     c = itemC.fetch() 
     c.done -> 
     ui.showDone() 
    else 
     ui.showDone() 

注意的丑陋:

  • 过度嵌套
  • 重复的代码

我的作文例行减少嵌套。在使用时,它看起来像这样:

chain = itemA.save() 
chain = andThen chain, -> 
    itemB.fetch() 
chain = andThen chain, -> 
    if x 
    itemC.fetch() 
chain.always -> 
    ui.showDone() 

andThen看起来是这样的:

andThen = (promise, doneCallback) -> 
    result = $.Deferred() 
    promise.fail (value) -> 
    result.reject(value) 
    promise.done (value) -> 
    cbResult = doneCallback(value) 
    if cbResult && cbResult['done'] 
     cbResult.done (value) -> 
     result.resolve(value) 
     cbResult.fail (value) -> 
     result.reject(value) 
    else 
     result.resolve(cbResult) 
    result.promise() 

我可能重新发明轮子。但我还没有在其他地方找到这个轮子。它在哪里?

我主要使用promises来抽象出如显示错误消息,请求在飞行中时禁用按钮等事情。而不是使用promise来嵌入这些内联事物,我可以将承诺交给一个能够对持续行动的成功或失败做出反应的组件。它使UI更加一致和可组合。

这意味着我需要一个表示多个延期整个链的承诺 - 无论采取什么路径,这都将得到解决。

+2

恭喜,那个车轮是承诺。 –

+0

不,承诺不是方向盘;我已经使用承诺,'那么'是轮子;) –

+0

阅读此:) https://gist.github.com/domenic/3889970 –

回答

1

我可能重新发明了方向盘。但我还没有在其他地方找到这个轮子。它在哪里?

它甚至有一个类似的名字:.then()方法!实际上它是promisesmain idea

itemA.save().then -> 
    itemB.fetch() 
.then -> 
    if x 
    itemC.fetch() 
.always -> 
    ui.showDone() 
+0

我阅读并重新阅读文档,然后确信它是几乎没有区别,除了在管道被弃用后添加的一些过滤逻辑。但现在回过头来看,回调函数返回的“可观察”对象将被正确组合。 –