Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我能';I don’我不能保证用一条新的错误消息正确地拒绝,该消息是从try/catch中捕获的_Javascript_Error Handling_Promise_Try Catch - Fatal编程技术网

Javascript 我能';I don’我不能保证用一条新的错误消息正确地拒绝,该消息是从try/catch中捕获的

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

我有一个Promise方法可以解析来自web的链接。它返回一个对象,我试图从该对象访问
链接
键,但当该对象为空时,如果我必须检查其长度,它会以某种方式跳过
,从而导致一个异常错误。下面是代码

首先,该方法承诺解析链接:

* 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]
访问
链接时产生的。我已经注销了
长度
,我确认要做工作并显示一个数字,但它坚持跳过它。我是不是在承诺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

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-我必须查看您的实际代码才能知道它有什么问题。这听起来像是代码中的语法错误。如果这不是你能弄明白的,那么我只能帮助你,如果我能看到整个相关的代码部分,包括错误位置前后的内容。