用promises链接多个ajax请求

时间:2014-05-15 00:15:55

标签: javascript promise rsvp.js

我希望将多个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变量。

2 个答案:

答案 0 :(得分:4)

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

这是一个不必要的(近乎)身份呼叫。

.then(function(json1){
     …;

您应始终return来自then回调,以便新承诺获得值。你甚至可以退还承诺,这将是"解开"!

  

我是否应该在彼此之间进行嵌套。?

无论是嵌套还是链接它们都不重要,那就是the great thing about promises。链接它们会降低金字塔的高度,因此它被认为更干净,但是您无法从更高的范围访问变量。在您的情况下,您需要访问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!
});

答案 1 :(得分:-3)

我正在编辑这个。我弄错了问题所在。问题是both是在函数内部定义的,除非您将both定义为函数外部的Object,否则它不能在函数外部访问。正如您创建的那样,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对象。