baskice
V2EX  ›  问与答

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

  •  
  •   baskice · Oct 6, 2017 · 5087 views
    This topic created in 3327 days ago, the information mentioned may be changed or developed.
    我再写一个简单的虚拟货币暴跌提示。但是交易所的 api 经常性会返回各种稀奇古怪内容或者干脆超时。

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

    function errorReTry(status) {
    var retries = 10;
    while (retries-- > 0 && !status) { //这样写真的有用吗?
    Sleep(1000);
    }
    return status;
    }
    14 replies  •  2017-10-08 01:49:30 +08:00
    laxenade
    laxenade
    Oct 6, 2017
    1
    你可以试试 RxJS 的 RetryWhen。应该还有其他方法,优雅的暂时只想到了这个。
    baskice
    baskice
    OP
    Oct 6, 2017
    2
    @laxenade 简单包起来即可……不需要这么复杂的……这重试比我代码都长了 https://github.com/Reactive-Extensions/RxJS
    xrr2016
    xrr2016
    Oct 6, 2017 via Android
    3
    干嘛不用 Promise.all
    vghdjgh
    vghdjgh
    Oct 6, 2017
    4
    虽然是 reconnection 库,也可以用来做 retry
    https://github.com/plantain-00/reconnection#usage
    rekulas
    rekulas
    Oct 6, 2017
    5
    可以用 coinmarketcap 的数据吧,已经帮你整合好了
    wxt2005
    wxt2005
    Oct 6, 2017❤️1
    6
    http://jsbin.com/teluve/edit?js,console

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

    我比较推荐的方式是采用 Promise + axios。至于 retry,有个 axios retry 的插件,不过不能很好地处理超时的情况。如果这方面是必须的话,建议自己简单写实现一下。
    iamppz
    iamppz
    Oct 6, 2017 via iPhone
    9
    ES6 的 promise 几行代码的事情
    cloud107202
    cloud107202
    Oct 6, 2017❤️2
    10
    ```
    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
    azh7138m
    Oct 6, 2017 via Android
    11
    @cloud107202 race 不更好吗。。。对 chrome 更友好
    cloud107202
    cloud107202
    Oct 6, 2017
    12
    @azh7138m 是 Promise.race() 么
    azh7138m
    azh7138m
    Oct 6, 2017 via Android
    13
    @cloud107202 嗯,稍微封装下就有超时重试了
    baskice
    baskice
    OP
    Oct 8, 2017
    14
    Promise 可行,谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2126 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    ♥ Do have faith in what you're doing.