2009-05-05 117 views
1

我想在函數中使用$ .post,獲取結果,然後根據$ .post回調的結果返回函數true或false。但是,回調似乎發生在父函數的返回事件之後。

下面是當前代碼ret變量總是未定義的,但如果我在$ .post回調中alert()它,它會返回正確的結果;

function elementExists(key, type, path, appid, pid){ 
    var ret; 
    $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){ 
     ret = data;       
    }); 

    alert(ret); 
    return ret; 

} 

回答

2

正如您發現該帖子是異步完成的。如果您希望它是同步的,則需要使用ajax方法並將async參數設置爲false。但是,最好是承認帖子是異步的並構建代碼,以便回調執行的操作與調用帖子的方法無關。很明顯,你確實想要做一些其他的事情,但不知道如何重構這個建議很難。

編輯:我知道您的代碼正在檢查是否存在某些內容,但它正在檢查該目的。如果我們知道目的是什麼,那麼可能會建議如何在回調中實現這一目標,以便可以重構該方法。

1
function elementExists(key, type, path, appid, pid){ 
     $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){ 
      alert(data); 
     }); 
    } 

功能(數據)是回調(異步),你可以不喜歡這個返回值。

它是回調不叫,直到頁面完成調用,但你的「返回RET」正在執行你打電話後立即$。員額

如果你想設置syncronous集異步:假

查看文檔 http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype

+0

我不認爲帖子支持設置異步選項。 – tvanfosson 2009-05-05 11:30:30

+0

所有的Ajax調用都是這樣做的,首先調用$ .ajaxSetup – 2009-05-05 11:49:37

0

問題是您的代碼異步執行。這是alert(ret)實際上在ret = data之前被調用,這在Ajax請求完成時發生。

您可以使用async選項使您的ajax調用同步(不推薦),也可以重新設計您的代碼。