2011-10-10 42 views
0

如果我使用閉包來定義某些東西,那麼可以這樣說,直到變量被填充後才移動到下一個位。有沒有一種方法可以暫停腳本,直到完成一個JavaScript閉包? JavaScript,jQuery,AJAX

實施例:

var myVari = someFunction(); 
$.each(myVari, function(){/*code for each*/}); 

限定myVari是AJAX調用,這可能需要一個第二或4的功能(酵母其不禁食)來定義變量。問題是,在AJAX調用產生結果之前,由於myVari爲空,$ .each已經發射並出錯。有沒有更好的方法來處理這種情況?

+0

我用一個函數作爲它的代碼,我想重新利用因各種原因 – chris

回答

6

您應該調整您的代碼,以便您可以將回調傳遞到someFunction,您在完成AJAX調用時執行該回調。

可以等待的AJAX調用完成的唯一方法是改變呼叫同步,但這是嚴重氣餒,因爲它對於AJAX調用期間完全鎖定了瀏覽器。

因爲你已經在使用jQuery庫,所以這個callbacks的過程變得非常容易。而不是返回變量就像你在那一刻,我會返回jQuery AJAX對象(which has a promise interface as of 1.6),這樣你就可以輕鬆地回調添加到它:

function someFunction() { 
    return jQuery.ajax('some/url.php', { 
     // whatever 
    }); 
} 

var myVari = someFunction(); 
myVari.done(function (data) { 
    $.each(data, function(){/*code for each*/}); 
}); 
+0

我認爲.done()的基礎上的回報實際上是等待結果阿賈克斯()?我不知道done()很好,謝謝。 – chris

+1

@chris:是的,你提供給'done()','fail()'和'always()'的回調被延遲,直到AJAX響應完成,並且結果可用。 – Matt

1

使用回調,像這樣:

someFunction(function(myVari) { 
    $.each(myVari, function(){ /*code for each*/ }); 
}); 

然後重新someFunction這樣的:

function someFunction(callback) { 
    var myVari; 

    /* ... */ 
    /* calcuate myVari */ 
    /* ... */ 

    /* instead of returning it, pass it to the callback: */ 
    callback(myVari); 
} 
-3

正確的方法是:運行而不是在自己的each的,運行Ajax調用內。

,你可以,我想你:

function checkFunc() { 
    setTimeout(function() { 
    if(myVari) { 
     $.each(........); 
    } else { 
     checkFunc(); 
    } 
    }, 1000); 
} 

那不是真正良好的編碼習慣,但它會奏效。

+0

嘿,不公平地給我一個-1 - 我完全知道這是一件壞事。 – Ariel

+2

那麼爲什麼在有很多更好的方法來解決問題時提出建議呢? – Matt

+1

完成。事實上,我確實提出了更好的方法 - 就在答案的頂部。但爲了防止提問者不能或不會使用這種方法,我給了他另一個。讓他無知的做法是迫使某人正確編碼,這不是我的生意。我從他的知識中完善他的代碼。 – Ariel

3

如果我明白你在做什麼,那麼你可以在你的ajax調用的'success'處理程序中嘗試你的$ .each。

重寫someFunction喜歡的東西 -

var myVari; //define this here or in whichever calling scope where it needs to be available. 
$.ajax({ 
    'url': 'http://..', 
    'type': 'GET', // or POST 
    'data': { } // whatever data you need to send 
    'success': function(data) { 
     myVari = process_the_server(data); 
     $.each(myVari, function() {...}); 
    } 
}); 
相關問題