我想你感兴趣的是$q.all https://docs.angularjs.org/api/ng/service/%24q#all。从文档中:
所有(承诺);
将多个 Promise 合并为一个 Promise,当所有输入 Promise 都得到解决时,该 Promise 也得到解决。
参数
Param | Type | Details
promises | Array.<Promise> Object.<Promise> | //An array or hash of promises
返回单个Promise
这将通过值的数组/散列来解析,每个值对应于承诺数组/散列中相同索引/键处的承诺。如果任何一个 Promise 以拒绝的方式解决,那么由此产生的 Promise 将以相同的拒绝值被拒绝。
Example
$q.all({
users: $http.get('https://api.github.com/users'),
repos: $http.get('https://api.github.com/repositories')
}).then(function(results) {
var users = results.users.data;
var repos = results.repos.data;
});
这是一个plunker http://plnkr.co/edit/tF91CP?p=preview这在行动中。
Update
在多次重读该问题后,我意识到异步发出两个 ajax 请求,同时只想对两个请求都有一个回调并不是原始问题的问题。
根据我的理解,问题是如何让多个 ajax 请求同时发生,而不考虑哪个先发生,并且不需要通用的已解决的承诺回调(如我最初的答案所述)。
当发出 ajax 请求时(例如$http.get(...);
),javascript的执行不会停止。如果发出另一个 ajax 请求,无论第一个请求是否完成,它都会触发。在间隔循环中不断发生 ajax 请求并让按钮事件触发独立的 ajax 请求不会导致任何冲突。
尽管问题中的代码并不理想,但我无法完全理解为什么“get_info”请求正在等待“set_info”请求完成。我创建了一个 jsFiddle 来尝试重新创建原始代码的功能,它似乎按预期工作:
http://jsfiddle.net/Tnt56/ http://jsfiddle.net/Tnt56/
我使用 jsFiddle 因为它有一个/echo/json/
api 功能来测试 ajax 功能。如果您在控制台中打开开发人员工具,此小提琴将记录 ajax 请求的关键点。 $timeout 包装器每 5 秒触发一次,我已将 GetDataajax 的响应设置为延迟 6 秒。当 getEventSeconds 函数登录到控制台时,单击 GetDataajax 按钮。它将记录它已启动,然后 getEventSeconds 将再次记录,最后 GetDataajax 将得到解析。
顺便说一句,我不得不使用 jQuery 的 $.ajax() 而不是 Angular 的 $http,因为出于某种原因,尽管使用了请求标头(Content-Type),$http 发布并不能很好地与 jsFiddle 的 echo 服务配合使用。该请求“有效”,但延迟功能无效。