2017-01-09 56 views
0

我沒有找到我需要做的事情,所以我要求你的幫助。我實際上正在做一個循環來獲取所有Docker機器,但有時候由於模糊的原因,機器「未定義」,並在一段時間後運行或停止。How to say在Javascript中重新啓動循環

我想要做的就是把一個東西放在我的代碼中(我把它放在代碼中),它停止所有的循環並重新啓動它。

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

沒有關鍵字或辦法做到它會自動。你需要自己動手做 – Weedoze

+0

如果我正確解釋你的問題,你想「等待」,直到所有的機器都定義好了嗎?如果是這樣的話,我會在while循環中調用['machines.every'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every),直到所有機器被定義。之後,你可以調用'machines.forEach'。 –

+0

是的,但如何編碼這樣的東西? @ Weedoze – Jerome

回答

0

你可以「等待」的所有機器用下面的函數定義:

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(); 
    } 
    }); 
} 

正如你所看到的,它返回一個Promise

然後調用它像這樣:

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

(我從代碼中剝離出來的流星的東西,因爲我與它沒有任何經驗,你必須重新添加它,很明顯。)

+0

精氨酸的事情之一是,在最的情況下,它是沒有定義的機器,你有一個想法如何等待,直到機器定義? – Jerome

+0

@Jerome編輯我的答案。那樣有用嗎? –

+0

我正在測試它atm – Jerome

0

控制循環的最簡單方法是使用basic循環並操作索引。

//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

這不是我試圖做的100%,在我的情況下,它是'機器'誰是未定義的,所以我需要等待,直到它不是undefined – Jerome

+0

@Jerome這是正確的,但可能有問題。一個循環吃幾乎100%的計算能力,所以一切都會減慢很多,直到機器加載。您冒險瀏覽器認爲它是「無限循環」並關閉。一個理想的解決方案將涉及[promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)或某種形式的[sleep](https://developer.mozilla .org/en-US/docs/Web/API/WindowTimers/setTimeout)循環測試之間的延遲。 –

+0

是的,我加了一個方法,在每個循環前等待Xsecond – Jerome

0

您可以創建一個功能

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

它的工作謝謝你! – Jerome

+0

您是否還檢查了@Emil提供的其他答案?它似乎更 –

+0

在這裏,'checkMachines' func被稱爲recuresively ..這可能是重 –

0

當機器未定義時,您可以簡單地減少索引。它會檢查本機,直到它被定義

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); 
    } 
}