我最近从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)
。
此代码有效吗?
答案 0 :(得分:0)
这段代码有效吗?
是。 (就try
/ catch
方面而言,请参阅下面的"旁注"。
我想知道是否应该将
try...catch
添加到func2
,但我得出的结论是try...catch
func1
已经处理过了。{ / p>
是的,确实如此。就像使用非async
函数一样,如果你想在那里处理错误,你只需要try
中的catch
/ func2
(全部,部分然后再处理) )投掷)。如果您不这样做,请允许它传播给呼叫者。只需确保将其处理。
附注:我假设func2
在return
是假值的情况下有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
做完全相同的事情,它完全取决于你喜欢写它的方式,这完全取决于给你。