2 回答

TA貢獻1828條經驗 獲得超3個贊
下面是您的任務的實現。這澄清了承諾執行的順序。onRecordAddTask
const requestAPI = record => {/* make API request */}
const saveToDatabase = result => {/* save result to database */}
const getImages = apiResult => {/* make images API request */}
const flatten = arr => arr.flat(1)
const uploadToS3 = image => {/* upload to s3 code */}
const onRecordAddTask = async record => {
const results = await requestAPI(record)
const [arraysOfImages,] = await Promise.all([
await Promise.all(results.map(getImages)),
await Promise.all(results.map(saveToDatabase)),
])
await Promise.all(flatten(arraysOfImages).map(uploadToS3))
}
onRecordAddTask應將每個新插入的記錄一起調用到數據庫中。該任務請求包含您的記錄的 API,并返回一個數組。然后,對于每個結果的結果,我們而我們每個結果并行;我們等待每個結果的圖像為.最后,我們將所有圖像作為 上傳到 s3。requestAPIresultssaveToDatabasegetImagesarraysOfImagesuploadToS3
我應該提到,我寫了一個庫來處理復雜的異步任務,比如你的任務;以下是如何使用該庫簡化上述代碼。
const { pipe, fork, map, get } = require('rubico')
const onRecordAddTask = pipe([
requestAPI,
fork([
map(getImages),
map(saveToDatabase),
]),
get(0),
map(map(uploadToS3)),
])
我不能等到第一個任務的所有承諾都得到解決,才能開始執行最新的任務。
因為返回單個承諾,你可以自由地讓它逃跑,這樣它就不會阻止你執行最新的任務。onRecordAddTask
如果我在數據庫上插入許多“任務”記錄會發生什么
您將開始執行任務的許多操作onRecordAddTask

TA貢獻1936條經驗 獲得超7個贊
簡短的回答是:是的
您可以同時運行所有承諾。
使用并傳遞一系列承諾。Promise.all([])
您的代碼將如下所示:
async function main() {
const promises = []
for(const task of tasks){
promises.push(task)
}
console.log('All promise at once')
await Promise.all(promises)
console.log('All promise at once done')
}
添加回答
舉報