[英]Wait for async task to finish
我正在與第三方 JavaScript 庫交互,其中一些 function 調用是異步的。 我沒有將異步邏輯應用到我的應用程序中,而是更喜歡為那些異步調用編寫同步包裝器。 我知道,我知道,這是糟糕的設計,但這是一個很有可能被完全重寫的演示項目。 我需要一些東西來向團隊展示這個概念,而不必真正擔心性能。
這是我想做的:
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {value = result;} );
return value;
}
我嘗試了 jQuery 的 deferred 和 promise 但它似乎是針對異步設計模式的。 我想在我的代碼中使用同步模式。
這將永遠不會起作用 ,因為JS VM已經從async_call繼續並返回了您尚未設置的值。
不要試圖打擊自然和內置的語言行為。 您應該使用回調技術或承諾。
function f(input, callback) {
var value;
// Assume the async call always succeed
async_call(input, function(result) { callback(result) };
}
另一種選擇是使用承諾,看看Q. 這樣你就可以返回一個promise,然后你將一個then偵聽器附加到它,這與回調基本相同。 當promise解決后,將觸發。
如何在回調中調用函數而不是在sync_call()中返回值?
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {
value = result;
use_value(value);
} );
}
這是一個如何工作的示例:-
function testAsync(){
return new Promise((resolve,reject)=>{
//here our function should be implemented
setTimeout(()=>{
console.log("Hello from inside the testAsync function");
resolve();
;} , 5000
);
});
}
async function callerFun(){
console.log("Caller");
await testAsync();
console.log("After waiting");
}
callerFun();
輸出:
Caller
Hello from inside the testAsync function
After waiting
為了使其更完整,應該添加錯誤處理(處理 reject() 情況)。
有關其他示例,請參見此處: https://www.delftstack.com/howto/javascript/javascript-wait-for-function-to-finish/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.