将多个 ajax 请求与承诺链接起来

Chaining multiple ajax requests with promises

本文关键字:承诺 链接 起来 请求 ajax      更新时间:2023-09-26

我希望链接多个ajax请求,大致如下:获取第一个 JSON,如果成功,则继续获取第二个 JSON,如果成功,则创建一个包含两个 JSON 数据的新对象。

// get first json
$.getJSON('http://www.json1.com').then(function(json1){
    return json1
}).then(function(json1){
    // get second json
    $.getJSON('http://www.json2.com').then(function(json2){
        var both = {}
        both.one = json1
        both.two = json2
        return both
    })
})

我应该将.then语句相互嵌套吗?我不完全确定如何获取both变量。

.then(function(json1){
    return json1
})

这是一个不必要的,(几乎(身份呼叫。

.then(function(json1){
     …;

您应该始终从then回调中return,以便新承诺获得值。您甚至可以返回承诺,这些承诺将被"解开"!

我应该将 .then 语句相互嵌套吗?

无论是嵌套它们还是链接它们并不重要,这就是承诺的伟大之处。链接它们会降低"金字塔"的高度,因此它被认为是更干净的,但是您无法从更高的范围访问变量。在您的情况下,您需要访问 json1 ,因此您必须嵌套它们。

我不完全确定如何获取这两个变量。

当您从回调中return时,您可以将其作为从then调用中返回的承诺的解析值。

$.getJSON('http://www.json1.com').then(function(json1){
    return $.getJSON('http://www.json2.com').then(function(json2){
        return {one: json1, two: json2};
    })
}).then(function(both) {
    // do something with both!
});

我正在编辑这个。 我错误地陈述了问题所在。 问题是both是在函数内部定义的,除非您将both定义为函数外部的对象,否则无法在函数外部访问它。 当你创建它时,both对整个世界都是不可见的,并且你创建both的唯一访问是用另一个延迟回调来处理它,但你仍然没有定义一个变量来保存该对象,更重要的是,这样做会延迟。

这是一种干净而简单的方法来完成您想要的事情。

 var json1=$.getJSON('http://www.json1.com');
 var json2=$.getJSON('http://www.json2.com');
 var both={};
 json1.then(json2).then(function(){
   both.one=json1.responseJSON;
   both.two=json2.responseJSON;
});

如果你想更酷,把它包装在一个函数中,并将 url 作为参数传递。 只需确保在可以访问它的作用域中声明both对象即可。