.catch函数不会捕获被拒绝的值

时间:2017-12-12 16:07:36

标签: javascript node.js promise

大家好!

我使用Node.js v8.5.0。 这是我在Node.js(简化)中的代码:

    // function that returns promise
    const request = (url) =>
      new Promise((resolve, reject) => {
        superagent
          .get(url)
          .end((err, res) => {
            if (err || !res.ok) {
              reject(err);
              return;
            }

            resolve(res);
          })
      })

   // function that add .then and .catch to promise   
   const to = promise =>
    promise
    .then((data) => [null, data])
    .catch((err) => [err]);

   // making request 
   let [err, result] = await to(request());

当我提出请求并且发生了一些错误时 .catch 函数没有捕获被拒绝的值,我收到错误,如未处理的承诺拒绝但是,实际上我添加了 .catch 功能来承诺。

有谁知道这里有什么问题吗? 感谢帮助!

2 个答案:

答案 0 :(得分:2)

superagent请求已经返回一个promise,所以请改用

const request = (url) => superagent.get(url).then(res=> {/*transform res**/ return res})

答案 1 :(得分:0)

您提供的代码没有这种行为,但我熟悉未承诺的承诺警告。

如果你想在以后捕获一个承诺的错误,你必须先捕获它并在你捕获之前返回承诺。

以下内容将为您提供未承诺的警告:

var failPromise = val => Promise.reject(val);
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]);
var p = failPromise(88);
//later you will catch the error
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100);

但是如果你稍微改变它,你就不会

var failPromise = val => {
  const p = Promise.reject(val);
  p.catch(ignore=>ignore);
  return p;//return the promise that did not have the catch
};
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]);
var p = failPromise(88);
//later you will catch the error
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100);

如前所述;你的请求方法应该只返回superagent返回的promise,但是这样你可以在没有错误的情况下捕获拒绝(警告):

const request = (url) => {
  const p = superagent
    .get(url);
  p.catch(ignore=>ignore);
  return p;
})

如果你想知道为什么你没有承诺;这是因为你捕获队列中的拒绝而不是堆栈中的拒绝。堆栈和队列解释为here

在堆栈中捕获的示例在控制台中没有导致错误,但随后返回没有捕获的promise。根据您要捕获它的队列中的距离,它可能仍然会给您错误,但在提供的代码中它不会。