2016-08-24 76 views
0

我遇到過在for循環中有一個異步函數的情況。我已經完成了我的先決條件搜索,現在知道forEach()或map()可能是我需要的解決方案。但是我看到的所有例子都只是console.log()每個異步函數的結果。如何將每個異步函數的結果設置爲一個變量,然後只返回變量?通過循環內的異步函數設置變量

下面是我在做什麼一些瘦身碼:(這是所有的節點,順便說一句)

var clients={ 
    "102323":{stuff about this client}, 
    "242341":{stuff about that client} 
}; 
var messages={}; 
for (var id_client in clients) { 
    mysql.query("SELECT * FROM messages WHERE id_client='"+id_client+"' ORDER BY date", function(err, rows) { 
     if (typeof rows !== 'undefined') messages[id_client]=rows; 
    }); 
} 
//do other stuff with messages variable 

有了這個,messages預見的是空。我明白。

但即使是在這個過渡使用地圖(),而不是爲(),像這樣...

​​

...消息最終被空。

最後,我想知道如何將mysql.query()封裝到另一個帶有回調函數的函數中,以及解決整個異步事件的所有問題。我只是不知道如何在循環內部迭代時如何工作。

+1

。在你的地圖調用VS您的for循環沒什麼區別 - 僅供參考。 – tymeJV

+0

@tymeJV - 有區別...''id_client'對於.map ...在for循環中的每次迭代都是「正確的」,它將是每次最後的客戶端 –

+0

相似性是當'messages'將會被填充 - 也就是在下一行代碼之後(沒有在代碼片段中顯示) –

回答

0

我推測你在map之後就是console.log()。但地圖還沒有完成,因爲它的回調是異步的。

您可以使用async獲得的map一個asynchnous版本,這將工作:

'use strict'; 
let async = require('async'), 
    messages = {}; 

async.map(Object.keys(clients), (id_client) => { 
    mysql.query("SELECT * FROM messages WHERE id_client='"+id_client+"' ORDER BY date", (error, rows) => { 
     if (typeof rows !== 'undefined') { 
      messages[id_client]=rows; 
     } 
     callback(error); 
    }); 
}, (error) => { 
    if(error) { 
     console.log(error); 
    } 
    console.log(messages); 
}); 
1

這是一個純JavaScript版本:

var clients={ 
    "102323":{stuff about this client}, 
    "242341":{stuff about that client} 
}; 
var messages={}; 
var cnt = 2; 

function done() { 
    console.log(messages); 
} 

mysql.query("SELECT * FROM messages WHERE id_client='"+id_client+"' ORDER BY date", function(err, rows) { 
    cnt--; 
    if (typeof rows !== 'undefined') messages[id_client]=rows; 
    if(!cnt) done(); 
}); 
3

您可以使用承諾。

var messages = {}; 
 

 
Promise.all(Object.keys(clients).map((id_client) => { 
 
    return new Promise((resolve, reject) => { 
 
    mysql.query("SELECT * FROM messages WHERE id_client='" + id_client + "' ORDER BY date", function(err, rows) { 
 
     if (typeof rows !== 'undefined') { 
 
     messages[id_client] = rows; 
 
     resolve(rows); 
 
     } 
 
    }); 
 
    }); 
 
})).then(results => { 
 
    console.log(messages); 
 
});