Javascript 用承诺链接多个ajax请求

Javascript 用承诺链接多个ajax请求,javascript,promise,rsvp.js,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').

我希望链接多个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
    })
})

我应该嵌套
。然后将
语句彼此嵌套吗?我不完全确定如何获取
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
对象

那是一个不必要的,(几乎)身份电话

您应该始终
返回
,然后从
回调中返回
,这样新承诺就会得到一个值。你甚至可以回报承诺,这将是“打开包装”

我应该嵌套吗?那么语句之间应该相互嵌套吗

不管你是把它们套起来还是把它们拴起来,这都无关紧要。链接它们会降低“金字塔”的高度,因此被认为更干净,但是不能从更高的范围访问变量。在您的情况下,需要访问
json1
,因此必须嵌套它们

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

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

$.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!
});

它不起作用吗?另外,您正在使用
.then()
,但这与仅使用回调参数并没有什么区别。为什么不直接用它来代替呢?嗯,我可能没有正确理解这个概念。我想我也应该合并
Promise
部分当您想同时等待这两个选项时,通常会使用承诺:
var p1=$.getJSON('url1');var p2=$.getJSON('url2');$。当(p1,p2).然后(函数(json1,json2){/*做某事*/})
您可以
返回
,然后
按他所做的方式回调!Bergi,你的答案是假设他不想访问函数之外的
,他可能不应该,但可能。这正是我想要的。你的解释也为我澄清了一些事情,谢谢!是的,他能。我的回答考虑到了这种可能性。@Bergi-除非有令人信服的相反证据,我仍然认为我的回答更清晰、更灵活,只要两者的范围都是为了避免内存泄漏。@user1167442:否,“回调之外”意味着“尚未加载”。
.then(function(json1){
     …;
$.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!
});