Javascript AngularJS中带有承诺的$http调用的条件链接

Javascript AngularJS中带有承诺的$http调用的条件链接,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我必须依次执行三个不同的$http调用,它们相互依赖。到目前为止,我的工作解决方案是这样的 $http.get(".../1/...").success(function(){ $http.get(".../2/...").success(function(){ $http.get(".../3/...").success(function(){ }); }); }); 现在需要做一个特定的更改:如果条件为true,则应跳过第一个调用。我可以这

我必须依次执行三个不同的$http调用,它们相互依赖。到目前为止,我的工作解决方案是这样的

$http.get(".../1/...").success(function(){
    $http.get(".../2/...").success(function(){
        $http.get(".../3/...").success(function(){

        });
    });
});
现在需要做一个特定的更改:如果条件为true,则应跳过第一个调用。我可以这样做:

if(skipCallOne) {
    $http.get(".../2/...").success(function(){
        $http.get(".../3/...").success(function(){

        });
    });
} else {
    $http.get(".../1/...").success(function(){
        $http.get(".../2/...").success(function(){
            $http.get(".../3/...").success(function(){

            });
        });
    });
}
$http.get(".../1/...").then(function(){
    return $http.get(".../2/...");
}).then(function() {
    return $http.get(".../3/...");
}).then(function() {

});
这显然会导致大量代码复制。我发现,如果我对特定的$http调用使用propper函数,这可以减少。但据我所知,更好的解决方案是正确地使用和链接$http承诺,如下所示:

if(skipCallOne) {
    $http.get(".../2/...").success(function(){
        $http.get(".../3/...").success(function(){

        });
    });
} else {
    $http.get(".../1/...").success(function(){
        $http.get(".../2/...").success(function(){
            $http.get(".../3/...").success(function(){

            });
        });
    });
}
$http.get(".../1/...").then(function(){
    return $http.get(".../2/...");
}).then(function() {
    return $http.get(".../3/...");
}).then(function() {

});

但现在我的问题是,如何以最少的代码复制有条件地跳过第一个调用?

您可以尝试以下方法:

$q.when(skipCallOne || $http.get(".../1/..."))
  .then(function() {
    return $http.get(".../2/...");
  }).then(function() {
    return $http.get(".../3/...");
  }).then(function() {
});

您可以在测试条件的函数中包装
$http.get
调用,如果条件适用,则返回
$http.get
承诺;如果条件不适用,则返回预解析承诺

function callOne() {
    if(condition) {
        return $http.get(".../1/...");
    } else {
        var deferred = $q.defer();
        deferred.resolve();
        return deferred.promise;
    }
}

callOne().then(function() {
    return $http.get(".../2/...");
})

我希望能够看到这样的东西起作用,所以我把这个小控制器放在一起,用一个有条件的$http.get先运行,来演示承诺。虽然我认为这与克里斯蒂安的解决方案非常相似,但我并不认为这和其他答案一样优雅或聪明

注意:有一件事可能使这一点难以理解,那就是这个问题的答案经常显示链接$http调用,这些调用只执行了,为了简单起见,这些调用返回的值被忽略了,并且可能不清楚如何将它们分开以实际获取这些值


事实上,我认为@PhilippAndreychev的解决方案更好,因为它对q更为惯用。这和我希望看到的完全一样。但是我不确定我是否理解$http.get(…)的用法。那你就不打电话了,为什么?我完全同意你的看法。我编辑了我的答案。让我们看一下文档:。当(value)将一个可能是值或(第三方)的对象包装成$q承诺时。当您处理的对象可能是承诺,也可能不是承诺,或者承诺来自不可信任的来源时,这非常有用。