Javascript 我能';I don’我不能保证用一条新的错误消息正确地拒绝,该消息是从try/catch中捕获的
我有一个Promise方法可以解析来自web的链接。它返回一个对象,我试图从该对象访问Javascript 我能';I don’我不能保证用一条新的错误消息正确地拒绝,该消息是从try/catch中捕获的,javascript,error-handling,promise,try-catch,Javascript,Error Handling,Promise,Try Catch,我有一个Promise方法可以解析来自web的链接。它返回一个对象,我试图从该对象访问链接键,但当该对象为空时,如果我必须检查其长度,它会以某种方式跳过,从而导致一个异常错误。下面是代码 首先,该方法承诺解析链接: * parseReporter() { const article = new Promise((resolve, reject) => { parser.parseURL(`https://www.google.com/alerts/feeds/${this.go
链接
键,但当该对象为空时,如果我必须检查其长度,它会以某种方式跳过,从而导致一个异常错误。下面是代码
首先,该方法承诺解析链接:
* 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()
的方法:
该错误是在尝试从parsed.feed.entries[0]
访问链接时产生的。我已经注销了长度
,我确认要做工作并显示一个数字,但它坚持跳过它。我是不是在承诺ittry/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
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
除此之外,正如Jaramonda所建议的,当你有一个承诺,并且你在两条道路上都解决和拒绝时,你也在使用反模式。您可以更高效地执行此操作:
resolve(mercury.parse(betterLink));
但是,您真正应该做的是向parser.parseURL()发出提示,这样您就可以使用承诺编写所有控制流逻辑。这是非常简单的,并且创建了一个可重用的接口,使用您可以在其他地方使用的承诺:
// make promisified version of parser.parseURL()
parser.parseURLP = function (url) {
return new Promise((resolve, reject) => {
parser.parseURL(url, (err, parsed) => {
if (err) return reject(new Error(err));
resolve(parsed);
});
});
};
function parseReporter() {
return parser.parseURL(`https://www.google.com/alerts/feeds/${this.googleAlertsUrlId}/${this.reporterUrlId}`).then(parsed => {
if (parsed.feed.entries.length === 0) {
throw new Error('Nothing to parse');
}
const link = parsed.feed.entries[0].link
const betterLink = link.substring(42, link.indexOf('&ct='))
return mercury.parse(betterLink).catch(err => {
// wrap error in Error object
throw new Error(err);
})
})
}
除此之外,正如Jaramonda所建议的,当你有一个承诺,并且你在两条道路上都解决和拒绝时,你也在使用反模式。您可以更高效地执行此操作:
resolve(mercury.parse(betterLink));
但是,您真正应该做的是向parser.parseURL()发出提示,这样您就可以使用承诺编写所有控制流逻辑。这是非常简单的,并且创建了一个可重用的接口,使用您可以在其他地方使用的承诺:
// make promisified version of parser.parseURL()
parser.parseURLP = function (url) {
return new Promise((resolve, reject) => {
parser.parseURL(url, (err, parsed) => {
if (err) return reject(new Error(err));
resolve(parsed);
});
});
};
function parseReporter() {
return parser.parseURL(`https://www.google.com/alerts/feeds/${this.googleAlertsUrlId}/${this.reporterUrlId}`).then(parsed => {
if (parsed.feed.entries.length === 0) {
throw new Error('Nothing to parse');
}
const link = parsed.feed.entries[0].link
const betterLink = link.substring(42, link.indexOf('&ct='))
return mercury.parse(betterLink).catch(err => {
// wrap error in Error object
throw new Error(err);
})
})
}
我建议对reject
的前两个调用应该是return reject
——因为reject不会“停止”其余代码的运行。。。因此,对length===0
的拒绝被调用,但随后代码继续尝试并使用…[0]。link
-它抛出了一个错误-它不会被Promise code内部的奇迹“处理”在前两个if
中,您的意思是拒绝解析的?否。。。我说过把return放在reject之前,这样后面的代码就不会被执行,因为reject不会从functionwesome返回。成功了。请给我写一个答案让我接受。我建议前两次调用reject
应该是return reject
-因为reject不会“停止”其余代码的运行。。。因此,对length===0
的拒绝被调用,但随后代码继续尝试并使用…[0]。link
-它抛出了一个错误-它不会被Promise code内部的奇迹“处理”在前两个if
中,您的意思是拒绝解析的?否。。。我说过把return放在reject之前,这样后面的代码就不会被执行,因为reject不会从functionwesome返回。成功了。请给我写一个答案让我接受。我在parse.parseURLP
@GabrielMFernandes的=
处收到一个错误,说ParseError:Unexpected Token
,只是一个打字错误。它应该是parser.parseURLP=
。但是,第一个点被指控有错误,下面方法的开头的花括号也有错误,两个点都说代码>丢失。我正在使用AdonisJS。@GabrielMFernandes-我必须查看您的实际代码才能知道它有什么问题。这听起来像是代码中的语法错误。如果这不是你能弄明白的,那么我只能在看到整个相关的代码部分,包括错误位置前后的内容时提供帮助。我得到一个错误,在parse.parseURLP
@GabrielMFernandes的=
处说ParseError:Unexpected Token
,只是一个输入错误。它应该是parser.parseURLP=
。但是,第一个点被指控有错误,下面方法的开头的花括号也有错误,两个点都说代码>丢失。我正在使用AdonisJS。@GabrielMFernandes-我必须查看您的实际代码才能知道它有什么问题。这听起来像是代码中的语法错误。如果这不是你能弄明白的,那么我只能帮助你,如果我能看到整个相关的代码部分,包括错误位置前后的内容。