這個問題在這里已經有了答案: 如何“等待”回呼回傳? (5 個回答) 5 小時前關閉。
(此問題的先前版本已作為如何在回圈中呼叫異步函式的副本而關閉。此版本明確說明這些函式不是異步的)
我有幾個無法修改的回呼樣式函式。僅更改 ABC 函式,如何以與 D 變數中存在的函式相同的順序獲得輸出。我曾嘗試使用 async-await,但由于超時事件,輸出為 ['123', 'ankit', '345'] 。
https://jsfiddle.net/ankitg1602/unrxv3k6
const A = (dev) => {
setTimeout(() => {
dev('ankit')
}, 300)
}
const B = (dev) => {
setTimeout(() => {
dev('123')
}, 50)
}
const C = (dev) => {
setTimeout(() => {
dev('345')
}, 500)
}
const D = [A, B, C]
const ABC = (args, dev) => {
// write your code here
Promise.all(D.map(async (fun1) => {
return await fun1(dev)
}))
}
ABC(D, (result) => {
console.log('result:', result) // ['ankit', 123, 345]
})
uj5u.com熱心網友回復:
這個想法是為了保證回呼樣式函式。下面,為每個函式創建一個在函式呼叫其回呼時決議的承諾。
映射promisfy以生成異步函式陣列。呼叫它們中的每一個來收集一系列承諾,然后同時解決這些承諾Promse.all()
const A = (dev) => {
setTimeout(() => {
dev('ankit')
}, 300)
}
const B = (dev) => {
setTimeout(() => {
dev('123')
}, 50)
}
const C = (dev) => {
setTimeout(() => {
dev('345')
}, 500)
}
const D = [A, B, C]
const ABC = async(args, dev) => {
const promisify = fn => () => new Promise(resolve => fn(resolve));
const promises = args.map(fn => promisify(fn)());
Promise.all(promises).then(dev)
}
ABC(D, (result) => {
console.log('result:', result) // ['ankit', 123, 345]
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/398415.html
標籤:javascript 数组 异步 异步等待
