单个 angularjs 承诺上的多个 .then() ——全部使用 _original_ 数据
Posted
技术标签:
【中文标题】单个 angularjs 承诺上的多个 .then() ——全部使用 _original_ 数据【英文标题】:multiple `.then()`s on single angularjs promise -- all use _original_ data 【发布时间】:2014-10-10 07:36:00 【问题描述】:我正在编写一个依赖于 Promise 的 angularjs 应用程序,虽然它正在运行,但我想知道我是否可以更优化地完成它。
在代码的开头,我创建了一个承诺来获取一些数据。完成后,我想运行几个都使用这些数据的函数。这些功能附加在应用程序的不相关部分,所以我不知道它们附加到承诺的顺序。它们也不需要按顺序完成。
app.service("Fetch", function ($q)
return function()
var def = $q.defer();
somelibrary.asynccall(function(error, data) //callback
if (error) def.reject(error);
else def.resolve(data);
);
return def.promise;
;
);
app.controller("ctrl", function ($scope, Fetch)
var prom = Fetch();
//somewhere:
prom.then(function(data)$scope.var1 = data["VAR1"];);
//somewhere else:
prom.then(function(data)$scope.var2 = data["VAR2"]);
);
这里的主要缺点是后面的then
s 只有在前面的完成时才会执行,这里没有必要。
另外,我需要在每个function(data)...
中添加return data
,否则下面的then()
没有data
可用。
没有其他方法可以做到这一点,更适合这种情况吗?
编辑:正如@jfriend00 所说,我弄错了;事实上,一旦成功解决了承诺,这两个函数都会并行运行,并且它们没有被链接,因此不相互依赖。感谢您的帮助
【问题讨论】:
使用你的模式,当 promise 被解决时,对同一个 promise 的两个.then()
调用将被一个接一个地调用。第二个.then()
只与最初的承诺有关,与第一个.then()
发生的事情无关。这些没有链接,因此第二个.then()
不依赖于从第一个.then()
返回的内容,并且两者都将传递相同的数据。它们只是同一个 Promise 的多个观察者,就像两个事件处理程序监听同一个事件。
jfriend00 是对的,您问题的上下文与您提供的代码无关。由于您的 Promise 没有被链接,因此您的成功回调上的 data
仍然来自原始 Promise。 prom = Fetch();
@jfriend00 你是对的,他们实际上并没有被锁住!我应该看到了,谢谢你的澄清!
【参考方案1】:
你需要并行执行:$q.all()
$q.all(
function1,
function2,
function3
).then(function(responses)
console.log(responses);
);
【讨论】:
感谢@monkeyinsight 的回复。这不是我想要完成的——我不想在解决承诺之前等待 >1 个函数完成。相反,我想在解决承诺时调用多个函数。我可以通过用多个函数替换代码中的console.log()
行来做到这一点,但我事先不知道这些函数将是哪些。我希望能够从应用程序中的各个站点添加它们,并在添加它们后立即启动它们,或者在承诺解决后立即启动它们(以较晚者为准)。
你想要递归then
?【参考方案2】:
将我的评论变成答案,因为它似乎解决了问题:
使用您的模式,当 promise 解决时,对同一个 Promise 的两个 .then()
调用将一个接一个地被调用。第二个.then()
只与最初的承诺有关,与第一个.then()
发生的事情无关。
这些没有链接,因此第二个.then()
不依赖于从第一个.then()
返回的内容,并且两者都将传递相同的数据。它们只是同一个 Promise 的多个观察者,就像两个事件处理程序监听同一个事件。
同一 Promise 上的两个 .then()
处理程序将按照它们附加到 Promise 的顺序被调用,并且都将传递相同的数据。
看到这两个答案:
Is there a difference between promise.then.then vs promise.then; promise.then
Understanding javascript promises; stacks and chaining
有关 chaining p.then(...).then(...)
与 branching p.then(...); p.then(...)
with promises 的更多信息。
【讨论】:
"有点像两个事件处理程序监听同一个事件" - 实际上它完全两个事件处理程序监听同一个事件。以上是关于单个 angularjs 承诺上的多个 .then() ——全部使用 _original_ 数据的主要内容,如果未能解决你的问题,请参考以下文章