Javascript代码部分未按正确顺序运行

时间:2019-04-13 22:26:42

标签: javascript asynchronous promise binance

我正在使用Javascript创建交易机器人(我以前没有使用这种语言的经验)。尾随止损功能的运行方式为:

  • Websocket收到当前市场价格
  • “活动”是一个布尔变量,如果为true,请运行代码
  • 如果价格上涨%,则取消旧的止损并增加新的止损。

我遇到的问题是代码未按正确的顺序运行。 如果您查看图片,我不明白为什么如果active为false,蓝色框仍然执行。而且由于该程序有时会以错误的顺序运行,因此websocket会停止或采取应有的操作。

Output

这是我的追踪止损websocket代码:

function binanceTrailingSLOrder(symbol, orderId, quantity, oldPrice, percentage, active) {

    const clean_trade = client.ws.trades([symbol], trade => { //run websocket
        var livePrice = parseFloat(binance_symbols[symbol]["close"]); //set new price to live price

        if (active == true) {
            binanceCheckOrderStatus(symbol, orderId).then(r => {
                switch (r.status) {
                    case "PENDING":
                        if (livePrice >= (oldPrice * ((100 + percentage) / 100)) && active == true) {
                            active = false;
                            binanceCancelOrder(symbol, orderId).then((r4) => { //Cancel previous SL
                                var newSL = livePrice * ((100 - percentage) / 100);
                                binanceStopOrder(symbol, 'SELL', r4.origQty, newSL, newSL).then((r5) => { //Set new SL
                                    orderId = r5.orderId; quantity = r5.origQty; oldPrice = r5.price;
                                    active = true;
                                }).catch((err) => {
                                    console.log(err);
                                });
                            });
                        }
                        break;
                    default:
                        break;
                }

            });
        }
    });

}

检查订单状态功能:

//Get specific order status
function binanceCheckOrderStatus(symbol, orderId) {
    if(!orderId){
        console.log("order Id not found");
        return false;
    } else {
        var client = loadBinanceKeys2();

        return client.getOrder({
            symbol: symbol,
            orderId: orderId,
            recvWindow: 1000000
        }).then((order) => {
            return order;
        }).catch((err) => {
            console.log(err);
        });
    }
}

1 个答案:

答案 0 :(得分:2)

JavaScript本质上是异步。函数binanceCheckOrderStatus()返回一个Promise。执行引擎将调用此函数,然后继续进行下一行。 .then(r =>之后的代码块仅在binanceCheckOrderStatus的{​​{1}}完成之后才执行。现在,在此时间段内,其他getOrder()请求中的活动对象可能已变为假。对于新开发人员而言,这可能会造成混淆。由于您在代码中使用了大量.then(),因此您必须了解.then()部分仅在.then()完成执行之前的函数之后执行。因此,耗时较少的函数将在其他函数之前执行.then()部分。简而言之,在这种情况下,您无法控制顺序,除非您知道每个功能将花费多少时间,这可能无法确认。要解决此问题,您必须使用 async / await 。或者,您需要更改逻辑,以使其较少依赖于深层的承诺。

我不太确定您要在这里实现什么,但是这里是有关如何解决订购问题的想法。这只是参考代码,我没有测试过。只是一个关于如何保持线程以确保代码使用 async / await 顺序运行的想法。

.then()