【发布时间】:2017-07-18 20:24:36
【问题描述】:
我有一个 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- 因为拒绝不会“停止”其余代码的运行......因此,@987654332 的拒绝@ 被调用,但随后代码继续尝试使用...[0].link- 这会引发错误 - 它不会被 Promise 代码内部的奇迹“处理” -
你的意思是,在前两个
if,到rejectparsed? -
no ... 我说把 return 这个词放在 reject 之前 - 这样它之后的代码就不会被执行 - 因为 reject 不从函数返回
-
太棒了。有效。请写一个答案让我接受。
标签: javascript error-handling promise try-catch