【问题标题】:how to use promises and try catch block如何使用 Promise 并尝试 catch 块
【发布时间】:2014-01-31 03:33:19
【问题描述】:

我有以下代码

var promise = getRaids(client);
promise.then(function (raids) {
    res.json(raids);
}, function (err) {
    console.error(err);
    res.send(403, { error: err});
});

我想将其转换为 try catch 块,我认为它更具可读性。 代码会是什么样子?

【问题讨论】:

  • Try/Catch 不适用于 Promise,这就是你得到错误函数的原因。

标签: javascript node.js promise


【解决方案1】:

使用这样的 Promise,它会变得可读:

getRaids(client)
.then(function (raids) {
    res.json(raids);
})
.catch(function (err) {
    console.error(err);
    res.send(403, { error: err});
});

【讨论】:

    【解决方案2】:

    我认为不可能将其转换为 try/catch 块。这样做需要阻塞 try 块内的 promise,而 JavaScript 不允许阻塞 promise。

    【讨论】:

      【解决方案3】:

      如果你真的想的话,你可以将 Harmony 与 node.js 和 use generators 一起使用:

      当您将错误 throw() 到生成器对象上时,错误实际上是 传播回生成器的代码,这意味着您可以 实际使用 try 和 catch 语句来捕获它。

      如果您希望通过 Promise 实现可读性,when.js 提供了一个 extended promise API,它允许使用诸如 catch 和 finally 之类的关键字。我确信 Q 和其他 Promise 库有类似的机制。

      promise.then(function() {
      
      }).catch(function(error) {
      
      }).finally(function() {
          // cleanup / etc.
      });
      

      【讨论】:

      • Q.js 确实提供了.catch() 和.finally(),但请记住,这两种方法都没有提供.then() 的过滤能力,即能够返回一个新的已解决或未解决的Promise。因此,根据具体情况,您可能需要promise.then(...).catch(...).finally(...);(如上)、promise.catch(...).finally(...).then(...); 甚至promise.then(...).catch(...).finally(...).then(...);。
      • 我对@9​​87654333@ promises 不太熟悉。但是,使用 when.js 承诺,您可以在 catch() 中返回新承诺,例如promise.then(...).catch(function(err) { return newPromise; })。您无法从 finally(...) 返回新的承诺,但我没有看到任何人愿意这样做的用例。
      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2016-03-05
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多