2016-06-17 40 views
0

我有麻煩異步禁用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

正如你所看到的,「外」總是先運行,其結果是不確定的,無法處理數據。

我已經嘗試
當......然後
異步=假
將數據作爲參數I/O功能
和其他東西,但沒有
:/

...非常感謝你
(我不是母語爲英語的人,我很抱歉,如果我寫得不好)

[解決]

也許不是最好的形式,但在「成功:」語句我稱之爲收到Ajax響應並觸發過程的其餘部分的功能,這樣我不需要存儲在一個變量和異步不影響我。

儘管如此,我會嘗試改進我的代碼。

坦克全部。

+0

試過'$ .Deferred'? –

+0

@SandeepNayak不,我不知道$ .Deferred。我會試着看看會發生什麼,謝謝。 – faanbece

回答

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; 
} 
+0

haha​​ha XD現在首先回答「outside」並返回「undefined」,等待X秒,然後執行請求以顯示「Inside」與數據,但謝謝。 – faanbece

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); 
    }); 
0

AJAX是asynchronous本質上,您需要通過callback,這將在收到ajax響應時調用。然後您可以從xhr對象訪問responseText

您也可以你的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); 
}); 

應避免通過設置async:false因爲這將阻止使得AJAX synchronous用戶界面上的進一步交互。

相關問題