簡體   English   中英

如何停止處理繼續通過 promise 拒絕

[英]How to stop processing continuing past a promise reject

我有異步代碼,我想在reject時停止運行。

筆記:

let ingestPromises = event.Records.map(async (record, i) => {
    let camera = JSON.parse(record.body)
    return new Promise(async (resolve, reject) => {

        let imageBuffer;
        try {
            imageBuffer = await retrieveImageFromURI(camera.ing_uri)
            console.log(`Record #${i} Successful Ingestion from URI`);
        } catch (err) {
            console.log("Going to reject");
            reject({ 'Task': `Attempting to pull image from camera (${camera.camName}`})
            console.log("Rejected");
        }

        console.log("Going to save file now...");
   //    ... blah blah more code ...
})}

let settledPromises = await Promise.allSettled(ingestPromises)
console.log('All promises settled :>> ', settledPromises);

當我針對無效的 uri 運行它時, retrieveImageFromURI function 按預期拋出超時錯誤。 這會跳過“Record X successful ingestion...”消息並按預期跳轉到 catch 塊。 然而,后來的事情go出乎意料。

Output 從上面的代碼中,當retrieveImageFromURI拋出一個錯誤看起來像這樣:

 Going to reject Rejected Going to save file now... All promises settled:>> [ { status: 'rejected', reason: { Task: 'Attempting to pull image from camera (TEST Camera)' } }]

我希望拒絕會停止 promise 內的任何進一步處理(就像返回一樣)並且我不會看到“被拒絕”或“現在要保存文件...”console.logs...

我在這里誤解了什么?

添加return停止執行,因為reject只是一個function,它不能讓function停止執行。

try {
  // ...
} catch (err) {
  console.log("Going to reject");
  reject({
    'Task': `Attempting to pull image from camera (${camera.camName}`
  });
  console.log("Rejected");
  return;
}

如果你有一個finally子句,你需要添加一個變量來跟蹤:

注意:這在這里沒有幫助,因為不管catch是否發生, finally都應該執行,但是如果你在catch內部有額外的檢查, return將 go 到finally中,所以需要一個額外的變量。

let shouldReturn = false;
try {
  // ...
} catch (err) {
  console.log("Going to reject");
  reject({
    'Task': `Attempting to pull image from camera (${camera.camName}`
  });
  console.log("Rejected");
  let shouldReturn = true;
  return;
} finally {
  if (shouldReturn) return;
}

調用 reject 沒有什么特別之處。 它只是一個 function。如果您想放棄進一步處理,您的 function 應該return

try {
  imageBuffer = await retrieveImageFromURI(camera.ing_uri)
  console.log(`Record #${i} Successful Ingestion from URI`);
} catch (err) {
  console.log("Going to reject");
  reject({ 'Task': `Attempting to pull image from camera (${camera.camName}`})
  console.log("Rejected");
  return;
}

我需要在提前解決/拒絕后返回嗎? 表示第一個reject (或resolve )將定義 Promise 的 fullfilled 值,但它們不會主動停止執行並且需要返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM