如何写一个 JavaScript 通用的重试 function?

2017-10-06 06:05:37 +08:00
 baskice
我再写一个简单的虚拟货币暴跌提示。但是交易所的 api 经常性会返回各种稀奇古怪内容或者干脆超时。

我希望能写一个通用的重试 function 把价格请求部分包起来。这样出错的话,反复尝试直到设置的上限停止。

function errorReTry(status) {
var retries = 10;
while (retries-- > 0 && !status) { //这样写真的有用吗?
Sleep(1000);
}
return status;
}
3975 次点击
所在节点    问与答
14 条回复
laxenade
2017-10-06 06:52:47 +08:00
你可以试试 RxJS 的 RetryWhen。应该还有其他方法,优雅的暂时只想到了这个。
baskice
2017-10-06 07:13:37 +08:00
@laxenade 简单包起来即可……不需要这么复杂的……这重试比我代码都长了 https://github.com/Reactive-Extensions/RxJS
xrr2016
2017-10-06 07:31:57 +08:00
干嘛不用 Promise.all
vghdjgh
2017-10-06 08:28:38 +08:00
虽然是 reconnection 库,也可以用来做 retry
https://github.com/plantain-00/reconnection#usage
rekulas
2017-10-06 08:32:12 +08:00
可以用 coinmarketcap 的数据吧,已经帮你整合好了
wxt2005
2017-10-06 08:47:13 +08:00
http://jsbin.com/teluve/edit?js,console

写得不太完善,LZ 看看能不能凑合用用。
k9982874
2017-10-06 08:53:57 +08:00
为啥不直接用 setTimeout ?
NemoAlex
2017-10-06 09:30:05 +08:00
在解决这个问题之前,你需要先弄清楚几个事情:
是前端用还是 Node 用?使用哪个 HTTP Client 库?
前端用的话,用户的浏览器会不会不支持 Promise ?如果存在的话,是不用 Promise,还是加一个 Polyfill ?
从你写的东西来看,对于 JS 的基础理解还不够,建议先完善下基础。

我比较推荐的方式是采用 Promise + axios。至于 retry,有个 axios retry 的插件,不过不能很好地处理超时的情况。如果这方面是必须的话,建议自己简单写实现一下。
iamppz
2017-10-06 09:42:35 +08:00
ES6 的 promise 几行代码的事情
cloud107202
2017-10-06 10:55:04 +08:00
```
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}


// e.g.
async function waiting_until_succeed(retry_interval = 2000) {
try {
const result = await api_client.getXXByXX();
} catch (err) {
logger.info(` ${err.message}`);
await timeout(retry_interval);
return waiting_until_succeed();
}
}

```
azh7138m
2017-10-06 14:16:53 +08:00
@cloud107202 race 不更好吗。。。对 chrome 更友好
cloud107202
2017-10-06 18:38:26 +08:00
@azh7138m 是 Promise.race() 么
azh7138m
2017-10-06 18:44:01 +08:00
@cloud107202 嗯,稍微封装下就有超时重试了
baskice
2017-10-08 01:49:30 +08:00
Promise 可行,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/395594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX