如何从这个jsFiddle中动态添加延迟到promise?

Hon*_*oni 6 javascript events promise deferred when-js

关于这个jsFiddle,我试图动态添加一个事件触发时创建的"延迟",所以只有当所有延迟被解析时才会调用完成的回调,包括后来添加的那些:

相关代码:

var promises = [ deferred1, ... ];
var p = when.all(promises).then(function() {
  console.log('All done!!');
  //! trigger
});

promises.push( deferredFromEvent ); // << ignored
Run Code Online (Sandbox Code Playgroud)

更新:欢迎使用Q或jQuery的建议,我正在寻找一个有效的建议

Nor*_*ard 0

预先做出您知道需要的所有承诺。和他们一起建造一个.when。保存从返回的承诺.when。当您添加需要新 Promise 的新事件时,请.when使用之前的 Promise.when以及您已完成的任何新 Promise 添加新的 Promise。

single points of failure如果您使用最后一个.when作为“继续使用该应用程序”,您的应用程序将有多个。IE:如果任何一个承诺在任何时候失败,那么.when在此之后创建的任何承诺也将失败。

...但是如果这是您的意图,或者您有一些可靠的错误处理,那么它应该可以满足您的要求。

我试图保持这个库无关——通常,我使用我自己的实现,它介于 jQuery 所做的事情和 Crockford 在最近的演讲中所做的事情之间,但如果我们假设:

函数返回promise-handlers
“当”返回一个promise-handler时promise-handlers至少有一个.doneand——.fail或者接受两个参数,或者函数内部发生的任何事情将控制promise是否是rejected/resolvedor kept/broken(或其他),然后你最终可能会得到一堆如下所示的功能:

var doing = doSomething(),     // returns promise
    making = makeSomething(),  // returns promise
    loading = loadSomething(), // returns promise


    dependencies_lvl_1 = when(doing, making, loading);
Run Code Online (Sandbox Code Playgroud)

稍后,您可能会添加一个新的模块或小部件——也许它可以节省一些工作:

var saving = saveSomething(), //returns promise
    dependencies_lvl_2 = when(dependencies_lvl_1, saving);
Run Code Online (Sandbox Code Playgroud)

也许之后,你需要切换页面,但你需要先缓存你的数据

var caching = cacheData(),   // returns promise
    when(dependencies_lvl_2, caching)
        .done(goToNextPage)
        .fail(handleError);
Run Code Online (Sandbox Code Playgroud)

如果你看一下它,你就会知道一个事实,只要when返回一个承诺,只有在所有承诺都得到遵守时(并且所有承诺都得到遵守时)才会成功,并且没有一个承诺被破坏,那么就dependencies_lvl_2包括来自 的所有依赖项dependencies_lvl_1,加上额外的承诺。

那么, level-3.when的分辨率取决于已添加到链中的每一个事物。

只要你继续将你的承诺缓存到变量中(或某种未来访问),你就可以继续将它们链接在一起,直到永恒。