多个`.then()`在单个的angularjs承诺 – 所有使用_original_数据
我正在写一个依赖于promise的angularjs应用程序,虽然它正在工作,但我不知道是否可以做得更好。
在代码的开始,我创build了一个承诺,取消一些数据。 当这样做完成后,我想运行几个都使用这个数据的函数。 这些函数附加在应用程序的不相关部分,所以我不知道它们附在promise上的顺序。 他们也不需要依次完成。
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"]}); });
这里的主要缺点是只有在前面的结束时才执行,这在这里是不必要的。
此外,我需要在每个function(data){...}
内添加return data
,否则以下then()
不具有可用的data
。
有没有另外的方法来做到这一点,更适合这种情况?
编辑:正如@ jfriend00提到的,我错了; 事实上这两个function都是在承诺成功解决的同时并行运行的,而且它们之间没有链接,因此也不相互依赖。 谢谢你的帮助
把我的意见转化为一个答案,因为它似乎清楚了这个问题:
在你的模式下,当promise被parsing时,两个相同的promise的调用将会被一个接一个的调用。 第二个.then()
只与原来的承诺有关,而与第一个.then()
没有任何关系。
这些没有链接,所以第二个.then()
不依赖于从第一个.then()
返回的内容.then()
并且两个都将传递相同的数据。 他们只是同一个承诺的多个观察者,就像两个事件处理程序在监听相同的事件。
对同一个promise的两个.then()
处理程序将按照它们附加到promise的顺序进行调用,并且都将传递相同的数据。
看到这两个答案:
那么承诺是否有所不同呢? promise.then
了解JavaScript的承诺; 堆栈和链接
p.then(...).then(...)
与分支 p.then(...); p.then(...)
p.then(...); p.then(...)
与承诺。
你需要并行执行: $ q.all()
$q.all( function1, function2, function3 ).then(function(responses) { console.log(responses); });