Я столкнулся с подобными вопросами, но ни один из них не подходит для моего сценария.Изменение внешней переменной массива изнутри для каждого обратного вызова
В приведенном ниже коде я использую функцию listContainers()
из библиотеки Javascript dockerode, чтобы перечислить идентификаторы моих контейнеров Docker. Этот фрагмент адаптирован из одного на докероде README. Выполняется вызов listContainers
, а строка console.log выводит идентификаторы, как ожидалось. Проблема в том, что я не могу выталкивать идентификаторы контейнера в массив, объявленный вне вызова функции, - результат состоит в том, что после вызова listContainers
массив остается пустым.
Я не очень разбираюсь в Javascript, но я думаю, что эта проблема связана с попыткой нажатия внутри функции обратного вызова. Проблема в том, что listContainers является асинхронным, поэтому это означает, что //CONSOLE LOG #2
фактически выполняет до //CONSOLE LOG #1
.
Как я могу записать значения id в массив ids вне вызова функции?
//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());
Получает ли 'listContains' асинхронный обратный вызов? –
Хм, он делает внешний звонок на сервер Docker, так что да, я так думаю. Нужно ли использовать Javascript-обещание? – EkcenierK
Это может быть один из способов работать с ним, да. См. [Этот вопрос] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) - способ формулировки вопроса немного отличается (тем, что он пытаясь вернуться из функции, а не встроенного обратного вызова), но предпосылка такая же. –