Node.js async / await try catch flow - 最佳实践

时间:2017-12-15 11:46:49

标签: javascript node.js asynchronous async-await ecmascript-2017

我最近从async/await搬到promises。但是,我不确定try...catch正确的流量。我有以下示例:

const rp = require('request-promise');

const func2 = async () => {
    const response1 = await rp('http://nodejs.org/dist/index.json');
    if (response1) {
      return await rp('http://headers.jsontest.com'); // #opt 1: return a value
      // return rp('http://headers.jsontest.com'); // #opt 2: return a promise:
    }
}

(func1 = async () => {
  try {
    const response = await func2();
    console.log('Success!');
  } catch(e) {
    console.log('Failed!');
  }
})();

我想知道是否应该将try...catch添加到func2,但我得出的结论是try...catch func1已经处理了 let mainbundle = Bundle.main.bundlePath let bundleURL = NSURL(fileURLWithPath: mainbundle) webView.loadHTMLString(content, baseURL: bundleURL as URL)

此代码有效吗?

1 个答案:

答案 0 :(得分:0)

  

这段代码有效吗?

是。 (就try / catch方面而言,请参阅下面的"旁注"。

  

我想知道是否应该将try...catch添加到func2,但我得出的结论是try...catch func1已经处理过了。{ / p>

是的,确实如此。就像使用非async函数一样,如果你想在那里处理错误,你只需要try中的catch / func2(全部,部分然后再处理) )投掷)。如果您不这样做,请允许它传播给呼叫者。只需确保将其处理

附注:我假设func2return是假值的情况下有response1。如果没有,func2的承诺在这种情况下的分辨率值将为undefined

附注2:我猜你已经添加了func1 =部分,只是为了给自己一个名称来引用问题,而不是你的真实代码。但是如果它是:除非你已经在某个地方宣布它没有显示,在你的例子中func1是一个隐含的全局。建议避免这些。 :-)更多在我的博客文章中:The Horror of Implicit Globals

旁注3 (他确实有点,不是吗?):如果您未在其他任何地方使用func1(仅将其用作如果你愿意,可以使用方便await使用的包装器,你可以通过使用async函数返回promise的事实来避免一定程度的缩进:

(async () => {
  const response = await func2();
  console.log('Success!');
})().catch(e => {
  console.log('Failed!');
});

好的一面是,它更简洁。缺点是它混合了隐喻。 :-)那个和try / catch完全相同的事情,它完全取决于你喜欢写它的方式,这完全取决于给你。