2016-10-22 115 views
2

我有以下代码。我所做的就是首先向第一个网址发送ajax请求。我收到了回复,并且需要回复一些数据。因此,我将这些数据放入user对象中。该响应还包括另一个网址。然后,我再向该新网址发送一个Ajax请求。我从网址得到回应,并将该数据添加到user对象中。在最后的then()函数中我返回user对象。但是,当我拨打get().done(function(data) { console.log(data) })时,我只收到user.data数组。它不包括第一个Ajax请求中的用户细节。 如何合并来自这两个请求的数据并作为承诺返回(可能延期)?链接ajax请求与jQuery的承诺

var get = function() { 
     var user = {}; 

     return $.ajax({ 
      url: 'URL', 
      method: 'GET', 
      type: 'JSON' 
     }).then(function(user) { 
      user['name'] = user.name; 
      user['joined'] = user.create_at; 

      return $.ajax({ 
       url: user.url, 
       method: 'GET', 
       type: 'JSON' 
      }); 
     }).then(function(data) { 
      user['data'] = data; 
      return user; 
     }); 
    }, 
+0

var user = {};'user'与'user(user){'中的'user'不一样,并且你在回调的前两行所做的是基本上什么都没有......重命名'var user'到'var anythingButUserOrDataForThatMatter' –

回答

1

在此功能

function(user) { 
    user['name'] = user.name; 
    user['joined'] = user.create_at; 

    return $.ajax({ 
     url: user.url, 
     method: 'GET', 
     type: 'JSON' 
    }); 
} 

你正在创建的函数的局部scope一个user变量。因此,当您在作业的左侧执行user['name'] = user.name;时,并不是指您在最高范围外定义的var user = {},而是指本地user

尝试命名取user数据别的东西,像userData

2

可以的$.ajax()呼叫context选项设置为user对象

var get = function() { 
    var user = {}; 

    return $.ajax({ 
     url: 'URL', 
     method: 'GET', 
     type: 'JSON', 
     context: user 
    }).then(function(user) { 
     this['name'] = user.name; 
     this['joined'] = user.create_at; 

     return $.ajax({ 
      url: user.url, 
      method: 'GET', 
      type: 'JSON', 
      context: this 
     }); 
    }).then(function(data) { 
     this['data'] = data; 
     return this; 
    }); 
} 
+0

@ 2619 jsfiddle https://jsfiddle.net/bLcn0j27/1/ – guest271314

1

把你的第二个。然后第一。然后内(链到$ .ajax调用)像这样

var get = function() { 
    return $.ajax({ 
     url: 'URL', 
     method: 'GET', 
     type: 'JSON' 
    }).then(function(user) { 
     return $.ajax({ 
      url: user.url, 
      method: 'GET', 
      type: 'JSON' 
     }).then(function(data) { 
      return { 
       name: user.name, 
       joined: user.create_at, 
       data: data 
      }; 
     }); 
    }); 
}, 

不需要任何其他变量在所有

+0

我认为唯一的缺点是,如果需要多个AJAX调用,您将要执行大量不必要的嵌套? – Terry

+0

因为在这种情况下只有两个我甚至没有考虑嵌套问题,但是,是的,厄运金字塔使用这种方法招手 –