预先创建您知道需要的所有承诺。与他们建立一个.when
。保存从.when
. 当您添加需要新承诺的新事件时,请.when
使用之前的承诺添加新的.when
s,以及您已完成的任何新承诺。
single points of failure
如果您使用 final.when
作为“继续使用应用程序” ,您的应用程序将有多个。IE:如果任何一个承诺在任何时候失败,那么之后.when
创建的任何承诺也将失败。
...但是如果这是您的意图,或者您有一些可靠的错误处理,那么您应该这样做。
我试图让这个库与库无关——通常,我使用自己的实现,它介于 jQuery 所做的事情和 Crockford 在最近一次谈话中所做的事情之间,但如果我们假设:
函数返回promise-handlers
“当”返回promise-handler promise-handlers 至少有一个.done
and .fail
-- 或者接受两个参数,或者函数内部发生的任何事情和任何事情都将控制promise是rejected/resolved
or kept/broken
(或其他),然后你最终可能会得到一堆看起来像这样的功能:
var doing = doSomething(), // returns promise
making = makeSomething(), // returns promise
loading = loadSomething(), // returns promise
dependencies_lvl_1 = when(doing, making, loading);
稍后,您可能会添加一个新模块或小部件——也许它会节省一些工作:
var saving = saveSomething(), //returns promise
dependencies_lvl_2 = when(dependencies_lvl_1, saving);
也许在那之后,您需要切换页面,但是您需要先缓存数据
var caching = cacheData(), // returns promise
when(dependencies_lvl_2, caching)
.done(goToNextPage)
.fail(handleError);
如果您查看它,您就会知道一个事实,即只要when
返回一个只有在所有承诺都被遵守(并且当所有承诺都被遵守时)才会成功的承诺,并且它们都没有破坏,那么dependencies_lvl_2
就包括来自 的所有依赖项dependencies_lvl_1
,加上额外的承诺。
那么, level-3.when
的分辨率取决于添加到链中的每一件事。
只要你不断地将你的承诺缓存到变量中(或某种未来的访问),你就可以继续将它们链接在一起,成为永恒。