如何强制$ ajax等待数据并将其分配给变量?

时间:2016-06-17 05:23:53

标签: javascript ajax asynchronous

我遇到麻烦异步禁用ajax。我有以下代码:

  function GetDataFromUninorte() {
        link="http://www.uninorte.edu.co/documents/71051/11558879/ExampleData.csv/0e3c22b1-0ec4-490d-86a2-d4bc4f512030";
        var result=
        $.ajax({
              url: 'http://whateverorigin.org/get?url=' + link +"&callback=?" ,
              type: 'GET',
              async: false,
              dataType: 'json',
                success: function(response) {
                  console.log("Inside: " + response);
                }
            }).responseText;
       console.log("Outside: "+result);
       return result;
      }

我得到以下结果:

"Outside" always runs first

正如你所看到的,"外面"始终先运行,结果未定义,无法处理数据。

我已经尝试过了 当...然后
Async = false
传递数据作为参数I / O功能
和其他东西,但没有什么 :/

...事先非常感谢你 (我不是英语母语人士,如果我写得不好,我道歉)

[解决]

也许不是最好的形式,但在成功中:"语句我调用一个接收ajax响应的函数并触发其余的进程,这样我就不需要存储在变量中,异步不会影响我。

尽管如此,我会尝试提出改进代码的建议。

坦克全部。

3 个答案:

答案 0 :(得分:0)

使用此:

function GetDataFromUninorte() {
    link="http://www.uninorte.edu.co/documents/71051/11558879/ExampleData.csv/0e3c22b1-0ec4-490d-86a2-d4bc4f512030";
    var result=
    $.ajax({
          url: 'http://whateverorigin.org/get?url=' + link +"&callback=?" ,
          type: 'GET',
          **timeout: 2000,**
          async: false,
          dataType: 'json',
            success: function(response) {
              console.log("Inside: " + response);
            }
        }).responseText;
   console.log("Outside: "+result);
   return result;
}

答案 1 :(得分:0)

使用可以使用回调,您可以阅读更多here

function GetDataFromUninorte(successCallback, errorCallback) {
    link="http://www.uninorte.edu.co/documents/...";
    $.ajax({
        url: 'http://whateverorigin.org/get?url=' + link +"&callback=?" ,
        type: 'GET',
        async: false,
        dataType: 'json',
        success: successCallback,
        error: errorCallback
    });
}

function mySuccessCallback(successResponse) {
    console.log('callback:success', successResponse);
}
function myErrorCallback(successResponse) {
    console.log('callback:success', successResponse);
}

GetDataFromUninorte(mySuccessCallback, myErrorCallback);

或者您可以使用promisesbad support in IE browsers

function GetDataFromUninorte() {
    return new Promise(function(resolve, reject) {
        link="http://www.uninorte.edu.co/documents/...";
        $.ajax({
            url: 'http://whateverorigin.org/get?url=' + link +"&callback=?" ,
            type: 'GET',
            async: false,
            dataType: 'json',
            success: resolve,
            error: reject
        });
    });

}

GetDataFromUninorte()
    .then(function(successResponse){
        console.log('promise:success', successResponse);
    }, function(errorResponse){
        console.log('promise:error', errorResponse);
    });

答案 2 :(得分:0)

AJAX本质上是asynchronous,您需要传递callback,这会在收到ajax响应时调用。然后,您可以从responseText对象访问xhr

你也可以jQuery Deferredpromise来解决你的问题,如下所示:

function GetDataFromUninorte() {
        var defObject = $.Deferred();  // create a deferred object.
        link="http://www.uninorte.edu.co/documents/71051/11558879/ExampleData.csv/0e3c22b1-0ec4-490d-86a2-d4bc4f512030";

            $.ajax({
                  url: 'http://whateverorigin.org/get?url=' + link +"&callback=?" ,
                  type: 'GET',
                  async: false,
                  dataType: 'json',
                    success: function(response) {
                      console.log("Inside: " + response);
                      defObject.resolve(response);    //resolve promise and pass the response.
                    }
                });
        return defObject.promise();    // object returns promise immediately.
          }

然后:

var result = GetDataFromUninorte();

$.when(result).done(function(response){
    // access responseText here...
   console.log(response.responseText);
});

您应该通过设置synchronous来避免制作AJAX async:false,因为这会阻止用户界面上的进一步互动。