在出错时重试异步函数,未处理的承诺拒绝

这个函数被一个父函数调用,它应该返回成功对象或错误。

我在尝试重试函数 4 次时无法使用 async。成功就万事大吉了。出错时,我收到“未处理的承诺拒绝”。

//create record
const createSFDCRecord = async (object,userData) => {
  console.log("trial",retryCount)
  return await conn.sobject(object).create(userData,async (err,ret) => {
    if (err || !ret.success) {
      if (retryCount < retryLimit) {
        setTimeout(async () => {
          return await createSFDCRecord(object,userData)
        },2000)
        retryCount++
      } else {
        pagerDutyEvent(
          `Failed to send ${userData.Trigger_Code_kcrm__c} form data into ${object} after 5x`,"error",err
        )
      }
    }
    console.log(`Created ${object} id : ${ret.id}`)
  })
}

sobject 来自 jsforce http://jsforce.github.io/jsforce/doc/SObject.html

panda781124 回答:在出错时重试异步函数,未处理的承诺拒绝

您将承诺与回调混合在一起:

  • sobject(object).create 返回一个 promise,因此无需使用回调参数。
  • return 带有值在 setTimeout 回调中没有意义。返回的值无处可去。
  • 重复尝试所产生的 promise 不会被链接:第一个的解决方案不会锁定到下一个。取而代之的是,您在 setTimeout 回调中有一个独立的 promise,不处理其解决或拒绝。

发生“未处理的承诺拒绝”是因为您有一个可以拒绝的承诺的 await,但您没有捕获发生这种情况时将在该行触发的异常。

您应该将其重构为这样的(未经测试的代码):

const delay = ms => new Promise(resolve => setTimeout(resolve,ms));

const createSFDCRecord = async (object,userData) => {
    let retryCount = 1;
    while (true) {
        console.log("trial",retryCount);
        try {
            let ret = await conn.sobject(object).create(userData);
            if (!ret.success) throw new Error("ret.success is false");
            console.log(`Created ${object} id : ${ret.id}`);
            return ret.id;
        } catch(err) {
            if (retryCount >= retryLimit) {
                pagerDutyEvent(
                   `Failed to send ${userData.Trigger_Code_kcrm__c} form data into ${object} after ${retryLimit}x`,"error",err
                );
                return -1; // Or throw an exception... but then deal with it.
            }
        }
        retryCount++;
        await delay(2000);
    }
}
本文链接:https://www.f2er.com/1520.html

大家都在问