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
    })    
})