簡體   English   中英

async.queue 帶有 async/await 風格的函數

[英]async.queue with async/await style functions

我正在嘗試創建一個函數,該函數從對象數組構建隊列,然后通過調用多個函數來處理每個對象。

處理函數是異步函數,在需要排隊之前,我使用 async/await 模式實現。 我認為這是必要的,因為每個都依賴於前一個的輸出,我不想有大量的嵌套 promise.then

即以前我有:

await Promise.all(messages.map(async(message) => {
    let activity = await activityController.getActivity(message.activityId);
    let url = await SMSController.getUrl(message.Token);
    let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
    // etc...
}

現在我想要做的是:

let queue = async.queue((message, done) => {
     let activity = await activityController.getActivity(message.activityId);
     let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
    // etc...
}

messages.forEach((message) => {
    queue.push(message);
})

我有問題,雖然這會導致

SyntaxError: await is only valid in async function

我似乎不太明白如何解決這個問題。

我在 async 模塊中找到了 asyncify 函數,它允許我這樣做:

var queue = async.queue(async.asyncify(async (message, done) => {
    let url = await SMSController.getUrl(message.token);
    // etc...
}

您正在尋找async.series ,而不是async.queue

series(tasks, callbackopt)

依次運行tasks集合中的函數,每個函數在前一個函數完成后運行。

所以只需按照文檔:

const messageCallbacks = messages.map(function(msg) {
    return async function(callback) {callback(await handleMessage(msg));
});


async.series(messageCallbacks,
// optional callback
function(err, results) {
    // results is now equal to whatever handleMessage resolves to
});

沒有異步:

async function asyncMessageQueue(messages) {
    const results = [];
    for(var i=0,l=messages.length; i<l; ++i) {
        results.push(await handleMessage(messages[i]));
    }
    return results;
}

async function handleMessage(message) {
        let activity = await activityController.getActivity(message.activityId);
        let url = await SMSController.getUrl(message.Token);
        let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
        // rest of the code
};

這也允許您提供具有任何先前結果的下一條消息:,只需將await handleMessage(messages[i])更改為await handleMessage(messages[i], results)然后:

async function handleMessage(message, prevResults) {
        // rest of the code
};

暫無
暫無

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

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