簡體   English   中英

如何使同步任務成為異步任務?

[英]how do make synchronous task as asynchronous?

class some{   
let result;

 function asyn addition(){
    if (this.result != 'addition'){   //synchronous
        return this.result;
    }
    else
    result = await do some asynchronous task;   // asynchronous promise using some third party lib.
    return result;
    }
    }
}

問題1 :我們可以在asyn函數中實現同步代碼嗎?

問題2:如何將同步作為異步任務,以便adding()可以異步工作?

注意:我只需要在同一功能中執行任務。

問題1:我們可以在asyn函數中實現同步代碼嗎?

原因。

問題2:如何將同步作為異步任務,以便adding()可以異步工作?

調用async function ,它將返回Promise ,如果您從async function省略async關鍵字,則應改為返回Promise對象。 例如:

/* async */ function async_fn() {
    return Promise.resolve('hello');
}

async function main() {
    let msg = await async_fn();
    console.log(msg);
}

如果您在上方調用main() ,則會在控制台中收到消息“ hello”。

await表達式只能在異步函數中使用 因此,如果您在“異步”函數中省略了async關鍵字,則您應該自己處理“承諾”。

根據https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function

調用異步函數時,它將返回一個Promise。 當異步函數返回值時,Promise將使用返回的值進行解析。 當異步函數拋出異常或某個值時,Promise將被拋出的值拒絕。

因此您的代碼在技術上等於:

function async_function() {
    return Promise.resolve('hello world');
}

class some {
    result;

    addition() {
        if (this.result != 'addition') {   //synchronous
            return Promise.resolve(this.result);
        } else {
            return new Promise(function (resolve, reject) {
                async_function().then(function (result) {
                    resolve(result); // Promise resolve here (normal return)
                }).catch(function (err) {
                    reject(err); // Promise reject (throw error)
                });
            });
        }
    }
}

並且由於async_function()返回類型也是Promise ,因此,如果您不打算在方法addition()操縱其result ,則可以使此函數更簡單:

class some {
    result;

    addition() {
        if (this.result != 'addition') {   //synchronous
            return Promise.resolve(this.result);
        } else {
            return async_function();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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