AngularJs:返回已经找到的嵌套$http解决方案的承诺,但为什么它能工作

AngularJs: return a promise of nested $http - solution already found but why does it work?

本文关键字:承诺 解决方案 为什么 工作 http 返回 嵌套 AngularJs      更新时间:2023-09-26

我想构建一个嵌套的$http.get,在第一个成功后,然后请求第二个。

然后我想出了这样的东西:

$http.get('/xxx').then(function(response){
    $http.get('/yyy').then(function(response){
        //do something
    })
});

但我想返回一个Promise,这样我就可以正确地组织我的代码。显然,上面的代码不符合我的需要。

然后我用$q.all()做了很多研究,但实际上用$q.all,第二个请求不会等待第一个,即使第一个请求没有成功响应,它也会发送第二个。

之后,我找到了一个解决方案,在我的情况下,它就像一个魅力:

var promise = $http.get('/xxx').then(function(response1){
    return $http.get('/yyy').then(function(response2) {
        return response2.data;
    });;
});     
return promise;

但我不明白为什么它会起作用???

在第一个promise($http.get(的成功函数中,它返回第二个promise作为then((函数的参数。

但如果我打电话给

promise.then(function(data){
    console.log(data);
});

我发现这里打印的数据是响应2.data,怎么可能呢?它不应该是第二个$http的Promise对象吗???

当您从promise .then(…)回调返回promise时,promise库将自动等待内部promise的解析,然后用该值解析返回的promise。

换句话说,如果你许下一个承诺,你就会找回它的内在价值。

这是承诺之美的一部分;你可以利用这个功能并链接你的承诺来减少嵌套:

var promise = $http.get('/xxx').then(function(response1) {
    return $http.get('/yyy');
}).then(function(response2) {
    return response2.data;
});

有关更多详细信息,请参阅我的博客。

第一次尝试不起作用,因为您没有返回内部http调用返回的promise。相反,它是从最初的承诺中返回一个派生的承诺。派生的promise使用未定义的值进行解析。

此处提供更多信息:http://www.syntaxsuccess.com/viewarticle/angular-promise-chaining-explained