【发布时间】:2021-03-28 14:05:25
【问题描述】:
我有这样的功能:
const x = y(callback);
x();
可以通过同步或异步回调调用:
const a = y(() => 42);
const b = y(async () => Promise.resolve(42));
函数y 应该接受一个回调,它可以是同步的或异步的。是否可以从同步或异步回调中捕获抛出的错误?
我不能简单地将回调包装在 try/catch 中:
const y = (callback) => function () {
try {
return callback(...arguments);
}
catch (callbackError) {
throw callbackError;
}
};
因为它没有捕捉到 Promise 抛出的错误。我不能只将.catch 链接到回调,因为它可能不是一个承诺。
我读过在调用函数may not trivial/may not be possible之前检查函数是否是一个承诺。
在将catch 链接到它之前,我不能调用它来检查它是否返回一个承诺,因为如果它抛出,catch 将不会被链接到调用上
有没有办法从可能是也可能不是承诺的回调中捕获错误?
根据 cmets,我应该指定我不希望函数返回承诺。那就是:
const a = y(() => { throw new Error(); })();
console.log(a instanceof Error);
const b = y(async () => { throw new Error(); })();
console.log(b instanceof Error);
const c = y(() => 42)();
console.log(c === 42);
const d = y(async () => Promise.resolve(42))();
console.log(d instanceof Promise);
应该都是真的。简单来说就是想返回错误或者结果
【问题讨论】:
-
第一个建议。也许把它们都当作承诺。在顶部的 Promise.resolve(blackBoxFunction).catch() 中包装这个“正常”回调,然后从中捕获错误
-
@Robert,我应该在问题中指定,我不希望函数在抛出错误时返回承诺
-
好的。但我认为您应该考虑以相同方式处理异步而不是异步回调的代码的统一行为。我不确定检查并设置条件何时是异步是个好主意。 (也许你的情况是,但总的来说我很确定不是)。微任务队列的延迟通常是问题。
-
@Robert 此函数将在将错误作为 promise 库的一部分返回之前对其进行修改,因此不幸的是,在这种情况下它可能是必要的。我会继续考虑是否是这种情况 - 谢谢!
标签: javascript asynchronous async-await promise