簡體   English   中英

等待異步任務完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM