【问题标题】:How to propagate a reject in a ES6 Promise chain?如何在 ES6 Promise 链中传播拒绝?
【发布时间】:2015-09-28 02:49:16
【问题描述】:

通常两个 Promise 对象是跨函数调用创建的。我已经把承诺放在一起,展示了我期望发生的事情:

new Promise((resolve, reject) => {

    //function call with returned promise...

    return new Promise((resolve, reject) => {

      reject("rejectCall_2")  //Prints nothing

    })

}).catch( e1 => {
  console.log('e1',e1) 
})

这应该将拒绝传播到我的父母承诺中。如何在外部承诺中捕获rejectCall_2?

【问题讨论】:

  • 为什么需要嵌套 2 个 promise?我看不到任何会导致这种代码的用例。
  • 旁注:拒绝错误,而不是字符串。即reject(new Error('rejectCall_2'));
  • 为什么要在 promise 构造函数中包装一个返回 promise 的方法调用?如果你有foo.bar() 返回一个承诺,你可以简单地foo.bar().catch(e => ...)
  • 我们有各种返回承诺的动作,这些动作经常调用索引数据库层,该层也返回承诺。我不明白你会如何硬编码承诺共享,我们只是让所有东西都返回一个承诺,然后将它们链接在一起。
  • 这看起来很像promise construction antipattern。您应该不使用new Promise 将事物链接在一起。

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

您不会从new Promise 内部返回任何内容。你返回的东西都只是扔掉,你所做的就是决心和拒绝。如果你想“返回”一些东西,包括另一个承诺,你要做的就是用那个东西解决。

所以你想要的是

new Promise((resolve, reject) => {
    //function call with returned promise...
    resolve(new Promise((resolve, reject) => {
    ^^^^^^^
      reject("rejectCall_2")
    }));
}).catch(e1 => {
  console.log('e1', e1) 
})

用 babel-node 测试。

FWIW,您不妨使用立即返回粗箭头格式并为自己节省几个花括号:

new Promise((resolve, reject) => 
    resolve(new Promise((resolve, reject) => 
      reject("rejectCall_2")
    ));
).catch( e1 => console.log('e1',e1));

我会注意到 cmets 表明你可能犯了“显式承诺构造函数反模式”,在这种模式下你构造一个承诺只是为了解决或拒绝它与你可能刚刚在第一名。我假设你的例子是一个人为的例子,旨在展示你的特定问题。

【讨论】:

  • 谢谢...它有效!我真的很高兴这是我的疏忽,而不是 es6 承诺中的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多