2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
下面是您的任務(wù)的實(shí)現(xiàn)。這澄清了承諾執(zhí)行的順序。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應(yīng)將每個(gè)新插入的記錄一起調(diào)用到數(shù)據(jù)庫中。該任務(wù)請(qǐng)求包含您的記錄的 API,并返回一個(gè)數(shù)組。然后,對(duì)于每個(gè)結(jié)果的結(jié)果,我們而我們每個(gè)結(jié)果并行;我們等待每個(gè)結(jié)果的圖像為.最后,我們將所有圖像作為 上傳到 s3。requestAPIresultssaveToDatabasegetImagesarraysOfImagesuploadToS3
我應(yīng)該提到,我寫了一個(gè)庫來處理復(fù)雜的異步任務(wù),比如你的任務(wù);以下是如何使用該庫簡化上述代碼。
const { pipe, fork, map, get } = require('rubico')
const onRecordAddTask = pipe([
requestAPI,
fork([
map(getImages),
map(saveToDatabase),
]),
get(0),
map(map(uploadToS3)),
])
我不能等到第一個(gè)任務(wù)的所有承諾都得到解決,才能開始執(zhí)行最新的任務(wù)。
因?yàn)榉祷貑蝹€(gè)承諾,你可以自由地讓它逃跑,這樣它就不會(huì)阻止你執(zhí)行最新的任務(wù)。onRecordAddTask
如果我在數(shù)據(jù)庫上插入許多“任務(wù)”記錄會(huì)發(fā)生什么
您將開始執(zhí)行任務(wù)的許多操作onRecordAddTask

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
簡短的回答是:是的
您可以同時(shí)運(yùn)行所有承諾。
使用并傳遞一系列承諾。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')
}
添加回答
舉報(bào)