自动解析后的诺言链

时间:2019-05-17 16:13:08

标签: node.js promise

谈到nodejs时,诺言:哪种链式实现是更好的做法,为什么?

Promise.resolve()
      .then(() => somePromise())
      .then(() => anotherPromise())
      .catch(e => log(e));

somePromise()
      .then(() => anotherPromise())
      .catch(e => log(e));

2 个答案:

答案 0 :(得分:2)

只要somePromise()始终返回承诺并且不同步抛出,就没有理由以Promise.resolve()开始连锁。这样只会创建多余的代码来运行,而不必要。您可以改为以somePromise()开头链(如您的第二个示例)。

但是,如果somePromise()可以同步抛出,并且您希望将其路由到.catch()处理程序中,那么您的第一个选择就是做到这一点。我会说somePromise()的设计不好,如果它既可以返回承诺又可以同步抛出,但是如果事实确实如此,并且您的代码不是您可以解决的,那么您的第一个选择就是解决该不良设计的一种方法。


此外,如果您的函数实际上没有任何自定义参数(尽管我意识到这可能只是伪代码),则不需要额外的函数。您可以这样做:

somePromise()
    .then(anotherPromise)
    .catch(log);

另一种可能性是使用同时捕获同步异常和promise错误并使用awaittry/catch处理偶尔不返回promise的函数的功能。

async function myFunc() {
    try {
        await somePromise();
        await anotherPromise();
    } catch(e) {
        log(e);
    }
}

答案 1 :(得分:1)

jfriend00是正确的,并用同步错误指定了它,但是我热烈建议您考虑使用async / await而不是链接,这是首选。有很多好处(性能,更好的堆栈跟踪和更容易的代码):

尝试{     等待somePromise();     等待anotherPromise());   } catch(e){log(e); }

通常,在新的Node中,如果somePromise丢进了内部-您将获得一个堆栈框架(在生产中)以显示调用代码,而使用常规链接则不会。