从ajax调用中的ajax调用中获取数据

时间:2015-01-19 13:56:47

标签: javascript jquery ajax

我需要一些帮助来确定如何从第二个ajax调用中获取数据,而不是第一个。

我有这个调用我的ajax调用的方法

var projectWithIssues = getProjects().done(function(result) {
....
}

当我查看结果时,我会在第一次ajax调用(getEnt_PodType()。done())上返回结果。我想从getProjects()中的第二个ajax调用中获得结果。我理解我得到第一个结果的原因是因为我在第一次ajax调用时得到了回报。但是,如果我没有返回那里。我在上面的行中得到了一个未定义的。如何从第二次调用中返回数据?

function getEnt_PodType() {
var ent_PodType;
var oDataUrl = //URL to my data;
return $.ajax({
    url: oDataUrl,
    type: "GET",
    async: true,
    beforeSend: function (xhr) {
        xhr.setRequestHeader("ACCEPT", accept);
    },
    success: function (xhr, textStatus) { 

    }
});
}


function getProjects() {

return getEnt_PodType().done(function (res) {
    var ent_PodType;

    if (res.d.results != undefined) {
        ent_PodType = res.d.results[0].Ent_PodType;
    }
    console.log("The ent pod type value is " + ent_PodType);

    var QUERY_FILTER = 
        "$filter=Ent_PodType eq '" + ent_PodType + "'";

    var url = restUrl + QUERY_FILTER;

    // I want to return the results from this ajax call
    $.ajax({  
        url: url,
        type: "GET",
        async: true,
        beforeSend: function (xhr) {
            xhr.setRequestHeader("ACCEPT", accept);
        },
        success: function (xhr, textStatus) {
            //projects = parseODataResultTest(xhr);
            //return projects;
        }
    });
});
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试使用deferred.then

中找到的模式
// first request
var request = $.ajax(url1), 
  chained = request.then(function( data ) {
    console.log(data) // first request response data
    // return second request
    return $.ajax(url2)
  });

chained.then(function( data ) {
  console.log(data) // second request response data
  // data retrieved from url2 as provided by the first request
});



    var request = $.ajax("https://gist.githubusercontent.com/guest271314/23e61e522a14d45a35e1/raw/62775b7420f8df6b3d83244270d26495e40a1e9d/ticker.json"), // first request , `html` document
      chained = request.then(function( data ) {
        console.log(data) // `["abc"]`
// return `data` from second request
        return $.ajax("https://gist.githubusercontent.com/guest271314/6a76aa9d2921350c9d53/raw/49fbc054731540fa68b565e398d3574fde7366e9/abc.txt")
      });
     
    chained.then(function( data ) {
      console.log(data) // `abc123`
      // data retrieved from url2 as provided by the first request
    });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用.then代替.done,它可以更好地链接函数。

将代码分开,以便两个AJAX调用位于不同的函数中,并使这两个函数return成为$.ajax调用的结果。然后您可以使用:

func1().then(func2).then(...);

func2将传递第一个AJAX调用的结果,然后的结果将传递给最终then中的任何函数。

在你的情况下,你也可以在链中调用parseODataResultTest,然后最终函数将被调用所需的数据,即:

getEnt_PodType().then(getProjects).then(parseODataResultTest).then(function(projects) {
    // use projects here, and _only_ here because it won't
    // be in scope or defined anywhere else
    ...
});