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

Javascript代码部分未按正确顺序运行,javascript,asynchronous,promise,binance,Javascript,Asynchronous,Promise,Binance,我在Javascript上创建了一个交易机器人(我以前没有使用这种语言的经验)。后续停止损失功能的运行方式为: Websocket接收当前市场价格 “active”是一个布尔变量,如果为true,请运行代码 如果价格上涨了%,取消旧的止损,增加一个新的更高的 我遇到的问题是代码没有按正确的顺序运行。 如果你看图片,我不明白为什么如果active为false,蓝色框仍然执行。而且,由于程序有时以错误的顺序运行,websocket会停止或执行它不应该执行的操作 这是我的尾随stoploss w

我在Javascript上创建了一个交易机器人(我以前没有使用这种语言的经验)。后续停止损失功能的运行方式为:

  • Websocket接收当前市场价格
  • “active”是一个布尔变量,如果为true,请运行代码
  • 如果价格上涨了%,取消旧的止损,增加一个新的更高的
我遇到的问题是代码没有按正确的顺序运行。 如果你看图片,我不明白为什么如果active为false,蓝色框仍然执行。而且,由于程序有时以错误的顺序运行,websocket会停止或执行它不应该执行的操作

这是我的尾随stoploss 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);
        });
    }
}

Javascript本质上是异步的。函数
binanceCheckOrderStatus()
返回一个承诺。执行引擎将调用此函数,然后转到下一行。
.then(r=>
之后的代码块仅在
binanceCheckOrderStatus
getOrder()
完成后执行。现在在这段时间内,其他
.then()
请求中的活动代码块可能会变为false。这可能会让新开发人员感到困惑。因为您使用了大量
。then()
在您的代码中,您必须了解
.then()
部分仅在
之前的函数之后执行。then()
完成执行。因此,花费较少时间的函数将执行它的
。then()
先分解后再分解。因此,简而言之,在这种情况下,您无法控制顺序,除非您知道每个函数将花费多少时间,这可能是不可能确定的。要解决此问题,您必须使用async/wait。或者,您需要更改逻辑,以减少对该dee的依赖p级承诺

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

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

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

        if (active == true) {

            try {

            const order = await binanceCheckOrderStatus(symbol, orderId);

            if (!order) {
                throw new Error('order not found')
            }
                switch (order.status) {
                    case "PENDING":
                        if (livePrice >= (oldPrice * ((100 + percentage) / 100)) && active == true) {
                            active = false;

                            const r4 = await binanceCancelOrder(symbol, orderId);
                            if (r4) {
                                var newSL = livePrice * ((100 - percentage) / 100);
                                var r5 = binanceStopOrder(symbol, 'SELL', r4.origQty, newSL, newSL);

                                if (r5) {
                                    orderId = r5.orderId; quantity = r5.origQty; oldPrice = r5.price;
                                    active = true;
                                }
                            }
                        }
                        break;
                    default:
                        break;
                }
            }

            catch(error) {
                console.log('error found: ', error);
            }

        }
    });

}



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

        return new Promise((resolve, reject) => {
            client.getOrder({
                symbol: symbol,
                orderId: orderId,
                recvWindow: 1000000
            }).then((order) => {
                resolve(order);
            }).catch((err) => {
                reject(err);
            });
        });
    }
}

您期望的顺序是什么?图片中显示的代码不可能
控制台。当
活动时,log(2)
false
时,除非
binanceCheckOrderStatus
更改
活动
的值-这似乎不太可能,因为它似乎不在同一上下文中能够做到这一点(您的代码不够清晰,无法显示是否添加了binanceCheckOrderStatus函数代码。它不会更新活动值。@Jaromandax您解释了所有这些并试图更正我的代码,这一事实使您与这里的大多数人大不相同!我将尝试此实现,并用我的结果更新您太谢谢你了!