Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular fire一次调用两个异步调用,但在第一个回调完成之前不处理第二个回调_Javascript_Angularjs_Asynchronous_Promise_Simultaneous - Fatal编程技术网

Javascript Angular fire一次调用两个异步调用,但在第一个回调完成之前不处理第二个回调

Javascript Angular fire一次调用两个异步调用,但在第一个回调完成之前不处理第二个回调,javascript,angularjs,asynchronous,promise,simultaneous,Javascript,Angularjs,Asynchronous,Promise,Simultaneous,我正在使用Angular的$q服务进行异步请求。我有两个这样的请求(假设我有一个名为MyService的angular服务来处理这些请求): 我不能保证第二次调用将在第一次调用之后完成,但我需要调用1的结果,以便在调用2中进行处理。我知道我可以将承诺链接在一起,这意味着调用2会在发出请求之前等待调用1完成,但我希望同时触发两个请求,因为我拥有执行此操作所需的所有数据。最好的方法是什么 编辑:我可以立即使用第一次调用的结果。他们在我的页面上绘制了一些图表。我不希望第一个呼叫等待第二个呼叫进行处理。

我正在使用Angular的$q服务进行异步请求。我有两个这样的请求(假设我有一个名为MyService的angular服务来处理这些请求):

我不能保证第二次调用将在第一次调用之后完成,但我需要调用1的结果,以便在调用2中进行处理。我知道我可以将承诺链接在一起,这意味着调用2会在发出请求之前等待调用1完成,但我希望同时触发两个请求,因为我拥有执行此操作所需的所有数据。最好的方法是什么


编辑:我可以立即使用第一次调用的结果。他们在我的页面上绘制了一些图表。我不希望第一个呼叫等待第二个呼叫进行处理。我认为这排除了像$q.all()这样的机制。

您可以使用
all

$q.all([MyService.Call1(), MyService.Call2()]).then(function() {
  // ...code dependent on both calls resolving.
});
编辑:对于评论,有两件事可能会引起您的兴趣。如果将数组传递给
all
,则会在
然后
中找到一个分辨率数组作为函数的第一个参数。相反,如果您将一个对象传递给
all
,您将发现一个对象作为第一个参数,其键与传递给
all
的键相同

$q.all([MyService.Call1(), MyService.Call2()]).then(function(arr) {
  // ...code dependent on the completion of both calls.  The result
  // of Call1 will be in arr[0], and the result of Call2 will be in
  // arr[1]
});
…和对象

$q.all({a: MyService.Call1(), b: MyService.Call2()}).then(function(obj) {
  // ...code dependent on the completion of both calls.  The result
  // of Call1 will be in abj.a, and the result of Call2 will be in
  // obj.b
});

使用
$q.all
的替代方法是在处理程序中使用第一个承诺作为第二个承诺。比如说

var p1 = MyService.Call1().then(function(data) {
    return processedData;
});

MyService.Call2().then(function(call2Data) {
    return p1.then(function(call1Data) {
        // now you have both sets of data
    });
});

为了解决一些问题,下面介绍如何处理错误/承诺拒绝,而不必等待两个承诺都解决或创建多个
catch
处理程序

var p2 = MyService.Call2().then(function(call2Data) {
    return p1.then(function(call1Data) {
        // now you have both sets of data
    });
});

// use `$q.all` only to handle errors
$q.all([p1, p2]).catch(function(rejection) {
    // handle the error here
});

可能需要提到的是,传递给成功处理程序的arg将是一个
[call1Results,call2Results]
数组。很抱歉,我没有说清楚,但我不希望第一个调用等待第二个调用。第一个调用应该完全独立于其他所有调用。当它完成时,它的数据用于在我的页面上呈现一些图表。我对$q.all()的理解是,它在返回之前等待所有承诺得到解决。我更新了我的问题以反映这一点。但是,如果
Call1()
Call2()
完成之前拒绝(以及无论如何,当它拒绝时),则可能会出现未经处理的拒绝错误<代码>承诺。所有的
都是有原因的:-)@Bergi不,不会的。这就是为什么在
Call2
处理程序中有
returnp1…
。如果
Call1
拒绝,则
p1
将是一个被拒绝的承诺,因此
Call2
将返回一个被拒绝的承诺是,但它将仅在
Call2()
履行后返回一个被拒绝的承诺,而不是立即返回。在此之前,
Call1()
的拒绝不会得到处理。@Bergi您说的是最终结果(Call2返回的承诺)。我的答案仍然会在Call1解决问题后立即处理它,当然我是,因为这是您通常处理错误的地方。显然,您当前的代码没有任何错误处理,但它需要两个错误处理程序。
var p2 = MyService.Call2().then(function(call2Data) {
    return p1.then(function(call1Data) {
        // now you have both sets of data
    });
});

// use `$q.all` only to handle errors
$q.all([p1, p2]).catch(function(rejection) {
    // handle the error here
});