2013-04-06 63 views
22

我想要一個從ajax請求返回值的函數。我想停止JavaScript的執行,直到函數獲得它通過ajax異步請求返回的值。 喜歡的東西:從ajax調用請求返回值的函數

function myFunction() { 
    var data; 
    $.ajax({ 
     url: 'url', 
     data: 'data to send', 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax asynchronus request 
    return data; // return data from the ajax request 
} 
+2

AJAX中的第一個A代表什麼? – Barmar 2013-04-06 05:17:43

+0

@Barmar Aaardvark! – Ian 2013-04-06 05:18:45

回答

32

您需要註冊一個回調函數,這樣的事情:

+2

不需要將其存儲在'data'中。只要撥打回電 – Ian 2013-04-06 05:22:27

+1

@伊恩仍然比其他的親屬更好:-) – 2013-04-06 05:28:19

+1

@JanDvorak永遠不會說它不是:)只是試圖幫助改善答案。 – Ian 2013-04-06 05:31:04

2

使用async: false以來的Ajax您的Ajax請求是異步的。

將async設置爲false意味着您要調用的語句必須先完成才能調用函數中的下一個語句。如果設置async:true,那麼該語句將開始執行,並且將調用下一個語句,而不管異步語句是否已完成。

從jQuery的docs

By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false

+1

你得給出比這更好的解釋。雖然這可能有效,但OP可能不會理解,因爲他們不瞭解手頭的問題。 – Ian 2013-04-06 05:19:36

3
$.ajax({ 
     url: 'url', 
     data: 'data to send', 
     async: false, 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax synchronus request 
4

你需要做的ASYN =假像:

$.ajax({ 
    async: false, 
    // ... 
    success: function(jsonData) { 
    //Your Logic 
    } 
}); 
+1

這是在你想要同步響應的情況下,當然。 – Pere 2014-06-03 11:47:00

5

Ajax是異步的,這意味着調用了ajax調用,但您的代碼仍然像以前一樣快樂地運行而不停止。在收到響應之前,Ajax不會停止/暫停執行。你必須添加一個額外的回調函數或類似的東西。

function myFunction() { 
var data; 
$.ajax({ 
    url: 'url', 
    data: 'data to send', 
    async: false, 
    success: function (resp) { 
     data = resp; 
     callback.call(data); 
    }, 
    error: function() {} 
}); // ajax asynchronus request 
return data; // return data from the ajax request 
    } 
+0

您需要將'data'或'resp'實際傳遞給回調函數。 – Ian 2013-04-06 05:21:47

+0

yes rgt ... .tahnx @lan ....用於重定向我.... :) – 2013-04-06 05:24:27

+1

那麼,您可能需要'callback.call(this,data);'因爲'call'的第一個參數是用於設置'this'的上下文在函數中。 – Ian 2013-04-06 05:25:38