Angularjs 为什么嵌套承诺不适用于我的代码
在此之前,我从未尝试过嵌套的承诺。然而,我所有的逻辑和互联网都认为它们应该起作用。但在下面的代码中,这种情况不会发生:Angularjs 为什么嵌套承诺不适用于我的代码,angularjs,asynchronous,angular-promise,Angularjs,Asynchronous,Angular Promise,在此之前,我从未尝试过嵌套的承诺。然而,我所有的逻辑和互联网都认为它们应该起作用。但在下面的代码中,这种情况不会发生: APIService.getData(Config + headerURL).then(function (response) { console.log(headerURL); console.log("header response from API", response); //Calling AP
APIService.getData(Config + headerURL).then(function (response) {
console.log(headerURL);
console.log("header response from API", response);
//Calling API for reference data
$http.get(DataURL).then(function (refData) {
console.log(Config + LeverReferenceDataURL);
$scope.levers = refData;
console.log("Setting ReferenceDataURL response from API", $scope.levers);
},function (error) {
console.log("API call for Reference data failed");
});
},function(error) {
console.log("API call for header data failed");
});
在这里,我尝试进行两个API调用来接收来自两个URL的数据。APIService是我用来进行http调用的角度服务。在此代码之前,我使用相同的服务进行两个调用。然后我认为两个API调用不能用同一个延迟对象解决。因此,现在我尝试直接使用$http进行内部调用
我想要的是,第二个调用应该在第一个调用之后立即进行,并且我的所有代码(在上面的代码段下面)应该等待,直到两个(或其中一个)调用都成功解决或被拒绝
目前我的代码失败,因为在第二次调用的数据到达之前,所有依赖于该数据的代码都会运行,而第二次调用的结果会稍后到达
我哪里做错了。实现所需结果的正确方法是什么?除非第二个API调用依赖于第一个API调用返回的数据,否则这样的嵌套只会使代码更难理解。你可以试试这样的
var firstPromise = APIService.getData(Config + headerURL);
var secondPromise = firstPromise.then(function() {
return $http.get(DataURL);
});
$q.all([firstPromise, secondPromise]).then(function(responses) {
var firstData = responses[0];
var secondData = responses[1];
/* Code here will not execute until both API
calls were successfully made */
}).catch(function(error) {
console.log("API call failed", error);
});
通过在第一个承诺之后定义第二个承诺,它保证了第二个API调用只有在第一个成功后才会发生。此外,您还需要为此解决方案注入
$q
。以下是一个plunker形式的示例
您需要返回承诺才能将其链接。因为您没有返回.then success.的承诺。我没有理解您,Kevin,第一次调用的.then()本身就是一个承诺,对吗??你能稍微解释一下
return$http(…
和return refData
你能澄清一下这句话吗我想要的是,第二次调用应该在第一次调用之后立即进行,我的所有代码(在上面的代码段下面)都应该等到这两次调用(或其中一次调用)之后再调用调用已成功解析或被拒绝。
@Chandermani我希望在执行任何其他操作之前加载这两个API数据。因此,我的意思是,我希望保证这些调用将一个接一个地进行,并且只有在这两个调用都已进行时,页面上的任何其他内容都应执行。我的第二个调用不依赖于数据根据您的响应,是一个数组,它包含两个API调用的数据,顺序相同。另外,我相信,只要我在$q.all()的.then()中编写所有依赖代码,它就可以用于2个以上的调用还有发生了什么。。当一个调用失败,或者它的承诺被拒绝时,这就是catch
的目的。如果任何承诺被拒绝,那么catch
代码将被执行,并带有该承诺中的错误。@Anid谢谢,它的save my loth time问题是关于嵌套承诺的。答案是关于带有实际工作的嵌套承诺例如,使用$q
是处理多个承诺的一种方法,但不是唯一的方法,而且并不总是合适的。FTW,真的吗?
// Service
return {
getData: function(url) {
return $http.get(url);
}
}
// Controller
service.getData(someUrl).then(function(someData) {
service.getData(otherUrl).then(function(otherData) {
// blabla
})
})