catch块中的resolve没有定义

时间:2018-03-05 11:22:13

标签: javascript promise

为什么我不能在catch块中调用resolve?

想要捕获失败的请求并在catch块中再次尝试但是 我的决心没有定义。我内心的承诺为什么我不能打电话给决心

module.exports.makeRequest = function(ID,requestAttempts) {

return Promise()
  .then(function(val, resolve, reject){
      request.get(url, {json:true}, function(err, res) {
          if(err || res.body.error_code)
              reject(err || res.body)
          else
              resolve(res.body)
      })
  })
  .catch(function (error) {
      if (requestAttempts <= 0) reject(error);
        console.log("Error :",error, `\n Try to repead the request (attempts left: ${requestAttempts} )`); 
        resolve(makeRequest(ID,requestAttempts - 1)); //HERE
  });

}

2 个答案:

答案 0 :(得分:2)

Promise构造函数使用resolvereject的函数。 .then没有。如果您想要解析.then.catch,只需返回该值即可。如果您想拒绝.then.catch,请抛出错误。

我认为你想要这样的东西 - 只需遵循结构 - 逻辑可能不是你想要的。

function makeRequest(ID,requestAttempts) {
   return Promise((resolve, reject) => {
       request.get(url, {json:true}, function(err, res) {
          if(err || res.body.error_code)
              reject(err || res.body)
          else
              resolve(res.body)
       })
    })
}

 makeRequest().catch(function (error) {
     if (requestAttempts <= 0) throw error;
        console.log("Error :",error, `\n Try to repead the request (attempts 
        left: ${requestAttempts} )`); 
    return makeRequest(ID,requestAttempts - 1));
 }); 

答案 1 :(得分:1)

您对Promise构造函数的使用不正确,并且您的resolve函数不在.catch函数回调的范围内。您的makeRequest功能也未在本地范围内公开,因此它甚至无法自行调用。

我会进一步建议移动&#34;重试&#34;实际处理AJAX请求的核心函数之外的逻辑。

function makeOneRequest(ID) {
    return new Promise((resolve, reject) => {
         request.get(url, {json: true}, (err, res) => {
             if (err || res.body.error_code) {
                 reject(err || res.body);
             } else {
                 resolve(res.body);
             }
         });
    });
}

function makeRequest(ID, count) {
    if (count <= 0) {
        return Promise.reject();
    } else {
        return makeOneRequest(ID).catch(() => makeRequest(ID, count - 1);
    }
}

module.exports.makeRequest = makeRequest;