[英]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.