Type/to search
6
Follow
968
Followers
Некоторые советы по отказоустойчивой инкапсуляции повторных попыток
FAQ
Created 2015-07-20 22:01:59  Updated 2015-07-20 22:06:32
 5
 2748

Причины, связанные с сетью бирж, могут привести к неудачным вызовам функций, таких как exchange.GetAccount, которые требуют повторных попыток, но каждый из функций перепробует один раз, показывая код, который слишком грозит блокировкой, можно решить следующим образом:

Функция должна быть в начале.

function EnsureCall(method) { var r; while (!(r = method.apply(this, Array.prototype.slice.call(arguments).slice(1)))) { Sleep(300); } return r; }``` 然后比如获取账户信息可以这样 ```var account = EnsureCall(exchange.GetAccount);``` 获取深度可以这样 ```var depth = EnsureCall(exchange.GetDepth);``` 要传入参数可以这样 ```var records = EnsureCall(exchange.GetRecords, PERIOD_M5);``` 这样以来,不管交易所网络如何不稳定, EnsureCall会重试得到的都是有效的数据, 不用每个函数都为了容错封装一次了. 当然你也可以把EnsureCall改名为EC或者Call之类好记又短的名子, 这样更方便.
Related Recommendations
Comment
All comments (5)

    请问这个有PY版本吗?

    9 years ago

    function EnsureCall(method) {
    var r;
    while (!(r = method.apply(this, Array.prototype.slice.call(arguments).slice(1)))) {
    Sleep(300);
    }
    return r;
    }
    function main() {
    InitAccount = EnsureCall(exchange.GetAccount());
    Log(InitAccount);
    }

    像上面这种调用,就会出现错误。

    11 years ago

    EnsureCall(exchange.GetAccount) GetAccount后面不用加()

    11 years ago

    我觉得你再做api的时候,把这个容错考虑进去最好。

    11 years ago

    大神测试过了吗?为什么我用的时候,出现这个错误:
    img

    11 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)