我有一个 Promise 方法来解析来自网络的链接。它返回一个对象,我尝试从中访问 link
键,但是当该对象为空时,它会以某种方式跳过 if
我必须检查其长度,从而导致丑闻错误。在代码下方。
首先,解析链接的 Promise 方法:
* parseReporter() {
const article = new Promise((resolve, reject) => {
parser.parseURL(`https://www.google.com/alerts/feeds/${this.googleAlertsUrlId}/${this.reporterUrlId}`, (err, parsed) => {
if (err) {
reject(new Error(err))
}
if (parsed.feed.entries.length === 0) {
reject(new Error('Nothing to parse'))
}
const link = parsed.feed.entries[0].link
const betterLink = link.substring(42, link.indexOf('&ct='))
mercury.parse(betterLink).then((data) => {
resolve(data)
}).catch((err) => {
reject(new Error(err))
})
})
})
return article
}
然后,这是调用此 parseReporter()
的方法:
* _getLastestNews(userReporter) {
const reportersOperation = new ReportersOperation()
reportersOperation.googleAlertsUrlId = userReporter.url.split('/')[3]
reportersOperation.reporterUrlId = userReporter.url.split('/')[4]
try {
return yield reportersOperation.parseReporter()
} catch (e) {
this.addError(HTTPResponse.STATUS_INTERNAL_SERVER_ERROR, e.message)
return false
}
}
该错误是在尝试从 parsed.feed.entries[0]
访问link
时引起的。我已经注销了 length
,并且我确认要进行工作并显示数字,但它坚持要跳过它。我对 Promise it try/catch
本身做错了什么吗?
最佳答案
reject
不会从 return
等函数中“停止”或“返回”
因此,您的代码正在检查错误条件,但会继续执行,就好像数据正常一样
通过在调用 reject
之前添加 return
,您将阻止这种情况发生
仅显示更改的代码区域:
// snip
if (err) {
return reject(new Error(err))
}
if (parsed.feed.entries.length === 0) {
return reject(new Error('Nothing to parse'))
}
const link = parsed.feed.entries[0].link
const betterLink = link.substring(42, link.indexOf('&ct='))
//snip
关于javascript - 我无法做出 promise ,用从 try/catch 捕获的新错误消息正确拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42499033/