2011-07-19 16 views
0

好吧,爲了爭辯,我們假設AJAX調用必須是異步如何從jQuery.ajax()中的成功和錯誤處理程序向父方法返回值?

基本上,我有一個jQuery AJAX調用,我想要的成功和錯誤處理的值返回給父方法:

下面的代碼不起作用,因爲AJAX調用是異步的。

var isValid = false; 

$.ajax({ 
    type: "POST", 
    url: myurl, 
    dataType: "JSON", 
    data: $myData, 
    async: true, 
    success: function(data) { 
     isValid = true; 
    }, 
    error: function() { 
     isValid = false; 
    } 
}); 

return isValid; 

那麼,有沒有一些方法來返回給調用方法傳遞一個值異步AJAX調用:因此,在接收前repsonse返回在函數底部的返回值?

+2

沒有設置'異步:FALSE'在方法執行結束之前,將無法捕獲成功/失敗。異步的要點是腳本不必等待ajax請求完成。如果您需要等待,請將async設置爲false。否則,您將需要重構您的方法以使用回調。 – Rodaine

+0

想知道爲什麼我的問題已下載....我的問題出了什麼問題?我希望它不是個人或東西.... –

+0

我需要'async:true',因爲我正在使用一個「加載」圖像/對話框,而請求正在運行,而這不適用於'async:false'。但是,呼叫頁面也需要知道呼叫是否成功。 –

回答

1

這裏是我想出了一個解決方案回答我的問題....(感謝@Rodaine給我這個主意!)

在調用方法中,我指定了一個回調函數。這裏是插件包含AJAX調用:

function ajaxCall(options) { 
    var url = options["url"] === undefined ? "" : options["url"]; 
    var addLink = options["addLink"] === undefined ? "" : options["addLink"]; 

    var $form = $(this).closest("form"); 
    var $formParamsString = $form.serialize(); 

    var aSuccess = []; 
    var aError = []; 

    if ($.isFunction(options["success"])) 
     aSuccess.push(options["success"]); 

    if ($.isFunction(options["error"])) 
     aError.push(options["error"]); 

    $.ajax({ 
     type: "POST", 
     url: url, 
     dataType: "JSON", 
     data: $formParamsString, 
     async: true, // Asynchronous to allow for loading image 
     success: aSuccess, 
     error: aError 
    }); 
} 

現在,當我調用這個函數,我可以指定選項回調對象:

ajaxCall({ 
    url: "myWebService.cfm", 
    success: function() { 
     alert("We did it!"); 
    }, 
    error: function() { 
     alert("Try again, fool!"); 
    } 
}); 
+0

不客氣!我應該提交評論作爲答案,而不是...:P – Rodaine

1

Return isValid; 

會調用完成之前執行,因爲它是異步的。

使用

async: false, 
+0

是的,我知道這一點。你的建議只是一種創可貼,並不能回答我的問題。 –

+0

嗯,我想我已經回答了你的問題(在你改變之前)!將值返回給調用例程的唯一方法是等待調用完成,即使其成爲同步調用。這就是同步和異步。如果這樣做不夠好,那麼您在執行成功或錯誤方法中執行的操作,您希望在調用方法中執行該操作。調用方法不會等待一個值,所以你不能這樣做。簡單, –

+0

你只是重複了我在原來的文章中已經陳述過的內容「下面的代碼不起作用,因爲AJAX調用是異步的,所以函數底部的返回值在repsonse被接收之前返回」。我的問題是如何從成功和錯誤處理程序返回一個值,而不是「我如何使這些代碼工作,我想怎麼樣?」 –

-1

使用synchronouse Ajax調用

集異步爲false。

+0

是的,我知道這一點。你的建議只是一種創可貼,並不能回答我的問題。 –

0

你不能這樣做,因爲isValid總是爲false。

如果您需要做的事情之後成功/失敗,你應該做的:

success: function(data) { 
    isValid = true; 
    otherFunction(isValid); 
}, 
error: function() { 
    isValid = false; 
    otherFunction(isValid); 
} 

通過這種方式,你可以處理不同的情況下

相關問題