为什么我不能在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
});
}
答案 0 :(得分:2)
Promise
构造函数使用resolve
和reject
的函数。 .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;