簡體   English   中英

console.log 未使用 await 變量記錄

[英]console.log not logging with await variable

我正在嘗試將 promise 的數據記錄到我的控制台,但它沒有顯示。 我已經嘗試在 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)
           
        }
    }


)()

您的代碼陷入了無限的while循環。 由於節點是單線程的,它將繼續執行循環直到被破壞,並且永遠不會執行原始 promise 中的.then代碼。 通過注釋掉while循環,您應該能夠輕松地看到這一點。

具體來說: binanceRest.newOrder是異步調用。 確實postOrder被調用,但是根據awaits決定優化的方式,所有的 await 都會同時被命中。 awaits解決時,如果 Nodejs 決定postOrders將恢復您的console.log將寫入,但是如果它首先遇到while循環,那么您的程序將卡在那里。

很抱歉這么說,但我可以在這段代碼中看到很多令人困惑的東西。

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

這永遠不會退出。 如果您省略了部分代碼不是一個好主意,因為這會使我們更難為您提供問題的實際答案。 如果這是您的真實代碼,我會更改

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

postOrder是處理 Promise 的async Promise ,這很令人困惑:我會將其重寫為

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 function ,它在沒有await的情況下調用,這也是混亂的根源。

我會開始清理你的代碼,可能很多問題也會得到解決。

希望這可以幫助。

不是“等待”問題

我在您的代碼中添加了一堆console.log指令,打印任何東西都沒有問題。 嘗試將相同的內容添加到您的原始代碼中,假設您的 API 工作正常,沒有失敗的理由。

以下代碼段模擬了您的 API,請查看結果。 您的錯誤必須出在您的邏輯、api 或語法上。

還要在你的while中添加一個安全中斷,如下所示: if (calls++ > 5) { break; } 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; } } } )()

仔細看看你的postOrder函數:

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

  binanceRest.newOrder({ ... })
    .then(...)
    .catch(...)
}

現在想象一下出現拼寫錯誤的場景,它應該是new api.FinanceRest(...) ,結果你最終會出錯:

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

postOrder 中的代碼postOrder被簡單地跳過,沒有console.log 所以這里的重點:如果在new api.BinanceRest({... })中導致錯誤(任何錯誤),那么您最終會遇到現在的情況。

還值得一提的是,帶有while循環的異步匿名 function 仍然會被執行,這是因為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"); })();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM