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