Javascript 在单个angularjs promise上有多个`.then()`s——都使用原始数据

Javascript 在单个angularjs promise上有多个`.then()`s——都使用原始数据,javascript,angularjs,promise,Javascript,Angularjs,Promise,我正在编写一个基于承诺的angularjs应用程序,尽管它可以工作,但我想知道我是否可以做得更好 在代码的开头,我创建了一个获取一些数据的承诺。完成后,我想运行几个都使用这些数据的函数。这些功能附加在应用程序的不相关部分,因此我不知道它们附加到承诺的顺序。它们也不需要按顺序进行 app.service("Fetch", function ($q){ return function() { var def = $q.defer(); somelibrary.

我正在编写一个基于承诺的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只在前面的那些完成时执行,这在这里是不必要的

另外,我需要在每个
函数(data){…}
中添加
返回数据
,否则下面的
then()
没有可用的
数据

难道没有其他更适合这种情况的方法吗



编辑:正如@jfriend00提到的,我错了;事实上,一旦承诺成功解决,这两个函数都会并行运行,并且它们没有链接,因此也不相互依赖。感谢您的帮助

您需要并行执行:

将我的评论转化为回答,因为它似乎澄清了问题:


使用您的模式,当承诺得到解决时,对同一承诺的两个
.then()
调用将被一个接一个地调用。第二个
.then()
只与最初的承诺有关,与第一个
.then()
上发生的事情无关


它们没有链接,因此第二个
.then()
与第一个
.then()
返回的内容没有依赖关系,并且两个都将被传递相同的数据。它们只是同一承诺的多个观察者,就像两个事件处理程序监听同一事件一样

同一承诺上的两个
.then()
处理程序将按照它们附加到承诺的顺序被调用,并将传递相同的数据

请看以下两个答案:


有关链接的更多信息,请参见
p.then(…).then(…)
分支
p.then(…);p、 然后(…)
承诺。

感谢@monkeyinsight的回复。这不是我想要完成的-我不想等到>1个函数完成后再解决承诺。相反,我希望在解析承诺时调用多个函数。我可以通过将代码中的
console.log()
行替换为多个函数来实现这一点,但我事先不知道这些函数是什么。我希望能够从应用程序中的各个站点添加它们,并在添加后或承诺解决后(以较晚者为准)立即启动它们。您想要递归
然后
?与您的模式类似,两个
。然后()
当承诺得到解决时,对同一承诺的调用将一个接一个地被调用。第二个
.then()
只与最初的承诺有关,与第一个
.then()
上发生的事情无关。它们没有链接,因此第二个
.then()
与第一个
.then()
返回的内容没有依赖关系,并且两个都将被传递相同的数据。他们只是同一承诺的多个观察者,有点像两个事件处理程序监听同一事件。jfriend00是对的,您问题的上下文与您提供的代码无关。由于您的承诺没有链接,因此成功回调中的
数据仍然来自原始承诺<代码>prom=Fetch()@jfriend00你说得对,他们实际上没有被锁住!我应该看到的,谢谢你的澄清!“有点像两个事件处理程序监听同一个事件”——事实上,两个事件处理程序监听同一个事件。
$q.all(
    function1,
    function2,
    function3
).then(function(responses) {
    console.log(responses);
});