我遇到過類似的問題,但沒有一個適合我的方案。從forEach回調中修改外部數組變量
在下面的代碼中,我使用dockerode Javascript庫中的listContainers()
函數來列出我的Docker容器的ID。該代碼片段從dockerode自述文件中的一個改編而來。 listContainers
調用工作,console.log行按預期輸出id。問題是我無法將容器ID推入在函數調用外部聲明的數組中 - 結果是在調用listContainers
之後該數組仍然爲空。
我對Javascript並不是非常有經驗,但我認爲這個問題是由於嘗試在回調函數中進行推送。問題是listContainers是異步的,所以這意味着//CONSOLE LOG #2
實際上在//CONSOLE LOG #1
之前執行。
如何將id值捕獲到函數調用之外的id數組中?
//Here is where I want to store my container ids.
var ids = [];
//Here is the dockerode call
dockerCli.listContainers(function(err, containers) {
containers.forEach(function(containerInfo) {
//log shows the correct id
console.log(containerInfo.Id);
//Here I try to save the container id to my array
ids.push(containerInfo.Id);
});
//CONSOLE LOG #1 Here I can see that the array has the correct values
console.log("IDs: "+ids.toString());
});
//CONSOLE LOG #2 Shows that the array is empty
console.log("IDs: "+ids.toString());
'listContainers'是否產生異步回調? –
嗯,它會對Docker服務器進行外部調用,所以是的,我認爲是這樣。我需要使用Javascript承諾嗎? – EkcenierK
這可能是一種使用它的方法,是的。看到[這個問題](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) - 這個問題的措辭是略有不同的(因爲它是試圖從函數返回而不是內聯回調),但前提是相同的。 –