Я не нашел то, что мне нужно сделать, поэтому я прошу вашей помощи. Я на самом деле делаю цикл, который получает всю машину Docker, но иногда по непонятным причинам машина "неопределена" и через несколько секунд они работают или останавливаются.

То, что я хочу сделать, это поместить в мой код (я поместил // здесь, в коде) вещь, которая останавливает весь цикл и перезапускает его.

getInfosMachines = Meteor.bindEnvironment(function(){
      //console.log("listener running");

      //clean the 2 arrays
      changeSpotted = false;
      stateLastCheckMachine.length = 0;
      stateDockerLastCheckMachine.length = 0;
      InfosMachines._ensureIndex({ "idMachine": 1});
          //add the collection value in the array
          InfosMachines.find().forEach(Meteor.bindEnvironment(function(mch){
              stateLastCheckMachine.push(mch.stateMachine);
          }));
          //take the actual values
          Machine.list({ inspect: true },Meteor.bindEnvironment(function (err, machines){
            machines.forEach(Meteor.bindEnvironment(function(machineInfo){
            if(typeof machines === "undefined"){
                sleep(2000);
                //here
            }else{
                stateDockerLastCheckMachine.push(machineInfo.state);
          }
      }));
}));

(да, там не весь код, но здесь я нуждаюсь в помощи) Спасибо за помощь

[РЕДАКТИРОВАТЬ] Спасибо всем, кто помог мне, я учился у всех вас!

0
Jerome 9 Янв 2017 в 16:05

4 ответа

Лучший ответ

Вы можете «подождать», пока все машины будут определены с помощью следующей функции:

function waitForDefinedMachines() {
  return new Promise(function(resolve) {
    var machines = ...; // Get machines.

    if (typeof machines === "undefined") {
      setTimeout(function() {
        resolve(waitForDefinedMachines());
      }, 1000); // Sleep for 1 second.
    } else {
      resolve();
    }
  });
}

Как видите, он возвращает Обещание.

И затем назовите это так:

waitForDefinedMachines().then(function() {
  // Do your forEach loop here.
});

(Я вычеркнул материал Meteor из кода, так как у меня нет с ним опыта. Очевидно, вам придется добавить его обратно.)

0
XåpplI'-I0llwlg'I - 9 Янв 2017 в 13:46

Вы можете создать функцию

function checkMachines(machines,stateDockerLastCheckMachine){
  var stop=false;
  machines.forEach(Meteor.bindEnvironment(function(machineInfo){
       if(stop){
         return;
       }
       if(typeof machines === "undefined"){
           sleep(2000);
           checkMachines(machines,stateDockerLastCheckMachine);
           stop=true;
       }else{
          stateDockerLastCheckMachine.push(machineInfo.state);
   })
}
0
Marco Moretti 9 Янв 2017 в 13:14

Вы можете просто уменьшить индекс, когда машина не определена. Он будет проверять эту машину, пока она не будет определена

for(let i=0;i<machines.length;i++){
    if(machines[i] === undefined){
        //Machine not started
        //Decrease index thus this machine will be check again next iteration
        i--;
    }else{
        //Machine has started. Do what you need with it
        stateDockerLastCheckMachine.push(machineInfo.state);
    }
}

Если вы хотите подождать 2 секунды, прежде чем снова проверить ту же машину, вы можете добавить функцию ожидания

function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}

for(let i=0;i<machines.length;i++){
    if(machines[i] === undefined){
        wait(5000);
        i--;
    }else{
        stateDockerLastCheckMachine.push(machineInfo.state);
    }
}
0
Weedoze 9 Янв 2017 в 13:46

Самый простой способ управления циклом - использовать базовый цикл for и манипулировать индексом.

//Pseudo machines so we have something to work with
var machines = [10, 1, 4, 5, 24, 5, 8, 2];
for (var i = 0; i < machines.length; i++) {
  //Get machine
  var machine = machines[i];
  //Do something with it
  console.log("iteration", i, "looking at machine", machine);
  //Restart loop if parameter
  if (Math.random() > 0.8) {
    console.log("Restart");
    i = 0 - 1;
  }
}

Версия со встроенным спящим режимом до загрузки всех машин:

var machines = [10, , 4, , 24, 5, 8, 2];
//Wrapped in function so we can easily recall it
function testMachines() {
    //initial loop to test for undefined machines
    for (var i = 0; i < machines.length; i++) {
        if (typeof machines[i] == "undefined") {
            console.log("machine at index", i, "is undefined");
            setTimeout(testMachines, 1000);
            return false;
        }
    }
    console.log("All ready, running loop");
    //Pseudo machines so we have something to work with
    for (var i = 0; i < machines.length; i++) {
        //Get machine
        var machine = machines[i];
        //Do something with it
        console.log("iteration", i, "looking at machine", machine);
    }
}
//Loading the machines
setTimeout(function () {
    machines[1] = 99;
    setTimeout(function () {
        machines[3] = 98;
    }, 2000);
}, 2000);
//Start testing
testMachines();
0
Emil S. Jørgensen 9 Янв 2017 в 13:46