【问题标题】:console.log not logging with await variableconsole.log 未使用 await 变量记录
【发布时间】:2020-10-21 07:37:48
【问题描述】:

我正在尝试将承诺的数据记录到我的控制台,但它没有显示。我已经尝试在 then 和函数之上定义 then 并尝试在执行算法之前使用 let 和重新定义但是。没有回应

样本

var trade;
const getTrades = async () => {
    return await axios({
        method: 'get',
        url: bUrl + tradeQuery
    })

}


const getSOrders = async () => {
    return await axios({
        method: 'get',
        url: bUrl + mOrderQuery
    })

}
const postOrder = async() => {
  const binanceRest = new api.BinanceRest({
      ...
    }
  )

  binanceRest.newOrder({
      ...
    })
    .then(async(data) => {
      const trades = await getTrades()
      const mOrders = await getSOrders()
      console.log(data)
      console.log(trades)
    })
    .catch((err) => {
      console.error(err)
    })
}

(
    postOrder(),
    async () => {
        const trades = await getTrades()
        const mOrders = await getSOrders()
        const sells = mOrders.data.asks
        const buys = mOrders.data.bids

        while (true/*while order is in */) {

            trade = trades.data[trades.data.length - 1]
             console.log(sells)
           
        }
    }


)()

【问题讨论】:

  • 所以把这个愚蠢的问题排除在外。你有没有打电话给postOrder
  • 你确定binanceRest.newOrder 确实在解决承诺吗?尝试通过控制台记录 Promise 对象本身以查看它是否已填充。
  • @Splox 是的,订单正在发生,问题是如果 const trades = await getTrades() const mOrders = await getSOrders() 未定义,则可以记录 .then 中的所有内容
  • 我编辑了这个问题,顺便说一下 console.log 在 while 工作
  • 请@CamilleBasbous,尝试解决我在回答中写的问题,你会发现很多问题都会解决。

标签: javascript node.js async-await binance


【解决方案1】:

您的代码陷入了无限的while 循环。由于 node 是单线程的,它将继续执行循环直到被破坏,并且永远不会执行原始承诺中的.then 代码。通过注释掉 while 循环,您应该能够轻松地看到这一点。

具体来说: binanceRest.newOrder 是异步调用。确实首先调用了postOrder,但是根据nodejs 决定优化的方式,所有awaits 都会同时被命中。当awaits 解析时,如果Nodejs 决定postOrders 将恢复您的console.log 将写入,但是如果while 循环首先命中,那么您的程序将卡在那里。

【讨论】:

  • 我是故意这样做的,但这不是问题交易和 mOrder 之前被调用并且应该在之前记录
  • 见我上面的编辑。测试一下,你会发现要么:它工作,要么它不工作,你还有另一个问题。
【解决方案2】:

我很抱歉这么说,但我可以在这段代码中看到很多令人困惑的东西。

while(true) {
  trade = trades.data[trades.data.length - 1];
  console.log(sells);
}

这永远不会退出。如果您省略了部分代码不是一个好主意,因为这会使我们更难为您提供问题的实际答案。如果这是您的真实代码,我会更改

while(trades.data.length) {
  trade = trades.data.pop();
  console.log(sells);
}

postOrder 是一个处理Promiseasync 函数,这令人困惑:我将其重写为

const postOrder = async() => {
  try {
    const binanceRest = new api.BinanceRest({ ... });

    const data = await binanceRest.newOrder({ ... });
    const trades = await getTrades()
    const mOrders = await getSOrders()
    console.log(data)
    console.log(trades)
  }
  catch(err) {
    console.error(err)
  }
}

最后一个postOrder 是一个async 函数,它在没有await 的情况下被调用,这也是混乱的根源。

我会开始清理你的代码,可能很多问题也会解决。

希望这会有所帮助。

【讨论】:

  • 不带await调用也没关系,除非这段代码运行在AWS lambda中,否则nodejs还是会等待event loop清空再关闭执行,也就是说不是问题的根源。
  • 这很重要 @WarrenParad 和 @CamilleBasbous 。由于流程永远不会从那个无限循环中退出,awaits 之后解析的其他代码块将永远不会运行。
【解决方案3】:

不是“等待”问题

我在您的代码中添加了一堆console.log 指令,打印任何内容都没有问题。尝试将相同的内容添加到您的原始代码中,假设您的 API 工作正常,没有失败的原因。

以下 sn-p 模拟您的 API,请查看结果。您的错误必须出在您的逻辑、api 或语法上。

还在你的while 中添加一个安全中断,如下所示:if (calls++ > 5) { break; },在我看来,无限循环是问题所在。

/* MOCK API'S */
let test = 0, calls = 0;
const fakePromise = (arg, apiName) => { return { then: (f1, f2) => { console.log('mocked result for ' + apiName); return f1(arg); } }; };
const axios = (args) => { console.log('-> axios is called', args); return fakePromise({data: { asks: ['ask'], bids: ['bid'], length: 1, 0: 'fake index'} }, args.url); };
const api = { BinanceRest: function(){ return { newOrder: () => fakePromise(' -> newOrder result <- ', 'newOrder')}; } };
const bUrl = 'bUrl/', mOrderQuery = 'mOrderQuery', tradeQuery = 'tradeQuery';


/* YOUR CODE STARTS HERE */
var trade;
const getTrades = async () => {
    console.log('-> getTrades is called');
    return await axios({
        method: 'get',
        url: bUrl + tradeQuery
    });
}

const getSOrders = async () => {
    console.log('-> getSOrders is called');
    return await axios({
        method: 'get',
        url: bUrl + mOrderQuery
    })

}

const postOrder = async() => {
  console.log('step 1');
  const binanceRest = new api.BinanceRest({
//      ...
  });

  console.log('step 2');
  binanceRest.newOrder({
//      ...
  })
    .then(async(data) => {
      console.log('step 3');
      const trades = await getTrades()
      const mOrders = await getSOrders()
      console.log('step 4.2');
      console.log('data: ', data)
      console.log('trades: ', trades)
      console.log('mOrders', mOrders)
    })
    .catch((err) => {
      console.error(err)
    })
}

// test
(
    postOrder(),
    async () => {
        console.log('step 4.1');
        const trades = await getTrades()
        const mOrders = await getSOrders()
        console.log('step 5', mOrders);
        const sells = mOrders.data.asks
        const buys = mOrders.data.bids
        console.log('step 5.0');

        while (true/*while order is in */) {

            console.log('step 5.' + (test++));
            trade = trades.data[trades.data.length - 1]
            console.log('sells: ', sells)
            if (calls++ > 5) {
              console.log('way too much calls, break! ');
              break;
            }
        }
    }
)()

【讨论】:

    【解决方案4】:

    仔细查看您的postOrder func:

    const postOrder = async() => {
      const binanceRest = new api.BinanceRest({ ... })
    
      binanceRest.newOrder({ ... })
        .then(...)
        .catch(...)
    }
    

    现在想象一下出现拼写错误的场景,f.e.它应该是new api.FinanceRest(...),结果你最终会出错:

    Uncaught (in promise) TypeError: api.BinanceRest is not a function

    postOrder 中的其余代码被简单地跳过,没有console.logs。所以这里的重点是:如果在new api.BinanceRest({ ... }) 中出现错误(任何错误),那么您最终会遇到现在的情况。

    还值得一提的是,带有while 循环的异步匿名函数仍然会被执行,这是因为postOrder 是一个async 函数,这意味着它返回一个待处理的Promise

    尝试在您的浏览器控制台中运行此程序,以更好地了解正在发生的事情:

    function delay(sec) {
      return new Promise((res, rej) => {
        setTimeout(() => res("delay " + sec + "sec"), sec * 1000);
      });
    }
    
    async function getTrades() {
      return await delay(0.1);
    };
    
    async function getSOrders () {
      return await delay(0.2);
    };
    
    async function postOrder() {
      console.log("postOrder");
    
      const api = {};
      const binanceRest = api.BinanceRest()
    
      delay(0.4)
        .then(async (data) => {
          console.log("postOrder result")
          const trades = await getTrades()
          const mOrders = await getSOrders()
          console.log(trades)
          console.log(mOrders)
        })
        .catch(err => {
          console.error(err);
        });
    };
    
    (postOrder(),
    async () => {
      const trades = await getTrades();
      const mOrders = await getSOrders();
      console.log("gfdfg");
    })();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2021-09-21
      • 2019-06-12
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多