单个 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"]);
);

这里的主要缺点是后面的thens 只有在前面的完成时才会执行,这里没有必要。

另外,我需要在每个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_ 数据的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 承诺处理 CoffeeScript 类

JavaScript承诺 - 多个承诺失败时的逻辑

猫鼬承诺永远不会到达 .then()

在 AngularJs 中清除服务数据

承诺问题 - .then() 没有被调用?

Javascript - 链多个获取承诺