2014-12-22 24 views
0

我有),其中一種方法是定義了名爲myMethod的(一個JavaScript文件,在這個方法中,我通過使用Dojo的xhrGet方法和Dojo調用後異步獲取數據有下面這一些其他的代碼道場電話。如果Dojo調用成功,則調用success()方法。等待而道場的xhrGet方法返回的價值

var dataVal = null; 

myMethod() 
{ 
    // Code1 - Before Dojo Call 
    Dojo.xhrGet(intoNodeWithLoadError(form, url, success, error)); // Dojo Call 
    // Code2 - After Dojo Call 
} 

success(data, xhr) 
{ 

    //dataVal = data; 
    //console.log("Success"); 
    // Doing stuff 
} 

的問題是像執行成功方法之後,我想繼續從代碼2 Dojo.xhrGet即後的在myMethod的代碼執行流程。

我想繼續使用Dojo調用的方法成功返回後,「代碼2」。 現在,這個Dojo.xhrGet在另一個單獨的線程中完成它的工作,即使在等待成功/錯誤方法被調用之前,Code2也會立即執行。

所以,讓代碼2將成功一直被稱爲後才能執行的一種靜態等待被呼叫道場後需要。

,如果您有怎樣把靜態等待狀態在JavaScript,請提出任何想法。

+0

你需要把碼2在'xhrGet'的'load'觸發這樣'dojo.xhrGet({網址:網址,負載:函數(){代碼2}}) '。 [閱讀文檔的更多信息](http://dojotoolkit.org/documentation/tutorials/1.6/ajax/) –

+0

我非常期待這個答案。但是讓我告訴你,它的一個大項目和這個方法正在被其他許多文件使用,並且這個myMethod()函數返回值爲被調用的方法。所以如果我們這樣做,那麼從負載無法返回值調用myMethod()的方法。所以我只想把等待條件。我們怎麼做到這一點?任何好主意? –

+0

如果你只想把延遲到您的代碼,然後嘗試[WindowTimers.setTimeout()](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout) –

回答

0

你不能等。有一種常見的JavaScript模式,稱爲承諾來做到這一點。

這通常意味着你做這樣的事情:

var promise = createMyPromise(); // Depends on the framework 
asynchronousFunction(function(data) { // Could be an XHR 
    promise.resolve(data); 
}); 

// "Waits" for it 
promise.then(function(data) { 
    // Do stuff with data 
}); 

但實際上,dojo/_base/xhrdojo.xhr模塊已經使用的承諾。所以沒有辦法改善。如果你想從方法中返回值,那麼你不會返回值,你會返回一個承諾。

例如:

var methodA = function() { 
    return dojo.xhrGet(/** Stuff */); 
}; 

var methodB = function() { 
    methodA().success(function(data) { 
    // Do stuff with data 
    }); 
}; 

有它周圍沒有其他辦法,但使用的同步/阻止請求。

有趣的閱讀可能是:What are the differences between Deferred, Promise and Future in JavaScript?