这个函数被一个父函数调用,它应该返回成功对象或错误。
我在尝试重试函数 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
答案 0 :(得分:2)
您将承诺与回调混合在一起:
sobject(object).create
返回一个 promise,因此无需使用回调参数。return
带有值在 setTimeout
回调中没有意义。返回的值无处可去。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);
}
}