用node.js本机promises替换bluebird会破坏Promise.reject

时间:2017-07-09 17:40:28

标签: 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());
}

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接管了promises,则代码在NotFoundError()构造函数内失败,因为未定义this。具体来说,构造函数从上面显示的getAccount()代码中正确调用两次,第二次调用node.js的_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()构造函数而且太错误了!!!

请帮忙。

1 个答案:

答案 0 :(得分:2)

问题是由by this line引起的:

.catch(NotFoundError, function() { ... })

原生承诺没有选项可以将特定错误类传递给catch方法,因此会发生错误时调用NotFoundError(没有new 1}}在它前面)因为它被认为是捕获处理程序。