gpt4 book ai didi

javascript - 如何组织递归的 Promise 调用

转载 作者:行者123 更新时间:2023-12-03 09:43:35 26 4
gpt4 key购买 nike

我正在使用 Facebook 图形 API,它经常返回“未知错误”消息,我发现如果我在几秒钟后重试该帖子,它就可以正常工作,不会出现任何问题。

此代码将调用 postAsync,收到成功响应后,它将使用新的 Promise 解决该问题,否则它将增加尝试计数器并再次调用该函数。

function guaranteedPost(endpointId, wallPost, attempts){
attempts = attempts || 0
++attempts
return graph.postAsync(endpointId + '/feed', wallPost).then(function(response){
return new Promise.resolve(response)
}).catch(function(error){
setTimeout(function(){
console.log(attempts)
console.log(error)
if(attempts == 2){
return Promise.reject('Too many attempts')
}
else{
return guaranteedPost(endpointId, wallPost, attempts)
}
}, 5000)

});
}

guaranteedPost(endpointId, wallPost, 0).then(function(value){
console.log(value)
})
.catch(function(error){
console.log(error)
})

我希望能够使用这样的代码,我在其中调用guaranteePost,并将响应或单个“尝试次数过多”错误消息记录到控制台。然而,目前我收到的输出是:

undefined
Unhandled rejection Error: Too many attempts

因此,第一个调用返回未定义,而没有错误处理的第二个调用则崩溃。

此外,我想在一个更大的函数的上下文中使用它,该函数可以访问之前定义的变量,因此我不想将错误和成功处理提取到它们自己的函数中。

我忍不住觉得我已经非常接近了,但这是在一两次完整的重构之后,我仍然无法完全确定它。我该如何正确设计?

最佳答案

将超时逻辑分解为实际的 promise ,然后返回。通过像这样执行 setTimeout ,您可以捕获错误并且不返回任何内容,然后将新请求排队,不返回任何内容来捕获其失败。 Promise 都是关于链接的。

function delay(ms){
return new Promise(function(resolve){
setTimeout(resolve, ms);
});
}

function guaranteedPost(endpointId, wallPost, attempts){
attempts = attempts || 0
++attempts
return graph.postAsync(endpointId + '/feed', wallPost).then(function(response){
return new Promise.resolve(response)
}).catch(function(error){

// Return a promise that waits a little bit, then tries again.
return delay(5000).then(function(){
console.log(attempts)
console.log(error)
if(attempts == 2){
return Promise.reject('Too many attempts')
}
else{
return guaranteedPost(endpointId, wallPost, attempts)
}
})

});
}

我还会稍微简化一下这段代码:

function delay(ms){
return new Promise(function(resolve){
setTimeout(resolve, ms);
});
}


function guaranteedPost(endpointId, wallPost, attempts){
return graph.postAsync(endpointId + '/feed', wallPost)
.catch(function(error){
if (attempts === 2) throw new Error('Too many attempts');

// Return a promise that waits a little bit, then tries again.
return delay(5000).then(function(){
return guaranteedPost(endpointId, wallPost, (attempts | 0) + 1);
})
});
}

关于javascript - 如何组织递归的 Promise 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com