我目前在使用 async/await 語法時遇到問題。在過去的 2 天里,我試圖找出原因并最終決定詢問。
我正在嘗試運行一個 cron 函式(測驗),該函式呼叫一個連接到資料庫的異步函式,并嘗試使用 3rd 方 API 查找有關每個條目的新資訊。
每個函式都獨立作業,但在組合它們時,它們不會以正確的順序運行,第一個函式會跳過第一行的 await 陳述句。(仍然執行它)
輸出如下所示(未定義 -> DB 條目 -> api 結果)
corret 應該看起來像(DB 條目 -> api 結果 -> 最終結果)
async function test() {
var db = await checkfornewdata() // executes
console.log(db) //skips line one and returns undefined as it didnt get its value
}
async function checkfornewdata()
{
var state = `SELECT * FROM users`;
var users= []
var newusers
console.log('Get connection ...');
connection.query(state , async function (err,result) {
if(err) throw err;
users= result
console.log('Query Result')
console.log(result) //works without problems
for (var i in result){
var checknew= await 3rdpartyapi.getusers(i.id );
if (i.joinDate> checknew.joinDate){
newusers.push(i);
}
console.log('New entries:')
console.log(newusers)
connection.end()
return newusers;
}
async function getusers(id)
{
var joinDate;
if (typeof(id) !== 'undefined'){
console.log("getting joinDate of " id)
await 3rdpartyapi.getUser(id).then(User => {
joindate= User.joinDate;
console.log(joinDate) //last output i recieve
})
.catch((err) => {
console.log(err)
return err;
})
return joinDate;
}}
uj5u.com熱心網友回復:
在您的checkfornewdata
函式中,您混合了承諾和回呼。在當前形式中,您的函式在對資料庫的呼叫完成之前回傳。(這就是為什么console.log(db)
回傳undefined
)。
要解決此問題,您可以使用支持承諾的 mysql 驅動程式(如mysql2)或像這樣重寫您的函式:
function checkfornewdata() {
// ...
return new Promise((resolve, reject) => {
connection.query(state , async (err, result) => {
if (err) {
return reject(err);
}
// ...
resolve(newusers);
}
}
}
uj5u.com熱心網友回復:
你需要在 for 回圈中等待!
嘗試await
在for
陳述句后添加如下:
for await (var i in result){
var checknew= await 3rdpartyapi.getusers(element.id );
if (element.joinDate> checknew.joinDate){
newusers.push(element);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318784.html
上一篇:Dart中按佇列執行順序異步回傳同步呼叫的Futures
下一篇:關閉IHostedService