亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何解決承諾?

如何解決承諾?

慕尼黑8549860 2022-08-27 14:10:03
我有一個腳本,可以執行很多承諾?;旧希业哪_本“Task”在將新記錄添加到數據庫時啟動。基于此記錄,我向 API 發出請求并獲取結果數組。然后,我將這些結果保存到數據庫中。然后,我使用相同的結果數組向用于獲取圖像的另一個 api 發出每個結果的請求。然后,所有這些圖像都將上傳到S3。因此,對于我執行的每個任務,我都會觸發很多請求,對數據庫的查詢,更新等。所有這些都在承諾中得到解決。所以我的問題是,如果我在數據庫中插入許多“任務”記錄會發生什么?承諾執行的順序是什么?程序會等到第一個任務(和子任務)結束嗎?或者程序會按任務獨立拋出結果,而其他任務也在解決?這是因為我不能等到第一個任務的所有承諾都得到解決才能開始執行下一個任務。如果您有其他問題,請告訴我,我可以更新問題。
查看完整描述

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


查看完整回答
反對 回復 2022-08-27
?
LEATH

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')

}


查看完整回答
反對 回復 2022-08-27
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號