将bluebird替换为node.js native promises会破坏Promise.reject
当我使用bluebird promises时,以下代码工作得非常好:将bluebird替换为node.js native promises会破坏Promise.reject,node.js,promise,bluebird,Node.js,Promise,Bluebird,当我使用bluebird promises时,以下代码工作得非常好: import * as Promise from 'bluebird'; getAccount(id) { var account = find(accounts, ['id', id]); return account ? Promise.resolve(account) : Promise.reject(new NotFoundError()); } NotFoundEr
import * as Promise from 'bluebird';
getAccount(id) {
var account = find(accounts, ['id', id]);
return account ?
Promise.resolve(account) :
Promise.reject(new NotFoundError());
}
NotFoundError
的定义如下:
export function NotFoundError(message = 'Not Found') {
this.name = 'NotFoundError';
this.message = message;
this.stack = (new Error()).stack;
}
NotFoundError.prototype = Object.create(Error.prototype);
NotFoundError.prototype.constructor = NotFoundError;
但是,如果我在getAccount()
中删除bluebird的导入,并让node.js接管承诺,则代码在NotFoundError()
构造函数中失败,因为未定义此
。具体来说,构造函数被调用两次,一次是从上面显示的getAccount()
代码正确调用,第二次是由node.js的\u tickCallback()
函数调用,其中this
未定义:
NotFoundError (errors.js:13)
runMicrotasksCallback (internal/proces…ext_tick.js:58)
_combinedTickCallback (internal/proces…ext_tick.js:67)
_tickCallback (internal/proces…ext_tick.js:98)
为什么node.js第二次调用NotFoundError()
构造函数,而且调用得太不正确了
请帮助。问题是由以下原因引起的:
本机承诺没有将特定错误类传递给catch
方法的选项,因此发生错误时,调用NotFoundError
(前面没有new
),因为假定它是catch处理程序。问题是由以下原因引起的:
本机承诺没有将特定错误类传递给
catch
方法的选项,因此发生错误时,调用NotFoundError
(前面没有new
)因为它被假定为catch处理程序。我无法使用您发布的代码使用Node v8进行复制。我在Node v6.9.5上。我可以尝试使用v8,但我们还没有移动到该版本。我也无法使用NodeV6进行复制。你能创建一个吗?是的,是创建MCVE的时候了。@robertklep,当我创建MCVE时,下面是我正在处理的示例:。README.md显示了如何运行测试。上一个测试在我导入bluebird时再现了问题。我无法使用您发布的代码在节点v8上再现问题。我在节点v6.9.5上。我可以尝试使用v8,但我们还没有移动到该版本。我也无法使用NodeV6进行复制。你能创建一个吗?是的,是创建MCVE的时候了。@robertklep,当我创建MCVE时,下面是我正在处理的示例:。README.md显示了如何运行测试。上一次测试在我取出进口的蓝鸟时重现了这个问题。哇!我不知道。是否有其他方法可以做到这一点?唯一的方法是使用一个catch
处理程序并检查错误类型以确定要采取的操作。非常感谢,@roberklep。你太棒了!哇!我不知道。是否有其他方法可以做到这一点?唯一的方法是使用一个catch
处理程序并检查错误类型以确定要采取的操作。非常感谢,@roberklep。你太棒了!
.catch(NotFoundError, function() { ... })