2016-10-18 6 views
0

Я пытаюсь запустить сценарий, который будет ждать 1 секунду между вызовами цикла. но код не будет распознавать параметр i.javascript - вызов callback с параметром

 for (var i = 0; i < lines.length; i++) { 
      var scanProgressInterval = setInterval(function(i) { 
      // Process the line, noting it might be incomplete. 
      if (lines[i].indexOf("(y/n)") > -1) { 
       console.log("includes (y/n)"); 
       ws.emit('scan', JSON.stringify({scan: false, question: lines[i]})); 
      } 
      else if (lines[i].indexOf("any key") > -1) { 
       console.log("any key"); 
       ws.emit('scan', JSON.stringify({scan: false, key: lines[i]})); 
      } 
      }, 1000); 
     } 

что с этим кодом?

+0

Почему бы не использовать setTimeout с внешним счетчиком и повторить его до тех пор, пока счетчик не достигнет 0 или 1000 или что-то еще? Не переутомляйте свою жизнь. Это уже достаточно сложно. – Azamantes

+0

setInterval (функция (i) { .......... }, 1000, i); это передаст параметр i функции setInterval – ShwethaU

ответ

1

Здесь «i» объявлено во всем мире.

Попробуйте использовать вашу функцию в качестве замыкания.

 function scanProgressInterval(i){ 
      setInterval(function() { 
       // Process the line, noting it might be incomplete. 
       if (lines[i].indexOf("(y/n)") > -1) { 
        console.log("includes (y/n)"); 
        ws.emit('scan', JSON.stringify({scan: false, question: lines[i]})); 
       } 
       else if (lines[i].indexOf("any key") > -1) { 
        console.log("any key"); 
        ws.emit('scan', JSON.stringify({scan: false, key: lines[i]})); 
       } 
       }, 1000); 
     } 

    for (var i = 0; i < lines.length; i++) { 
      scanProgressInterval(i); 
     } 
+0

Это сработало отлично. Благодаря! – Mumfordwiz

0

Вы должны добавить Params за в timout:

setInterval (функция, миллисекунды, param1, param2, ...)

Смотри here для получения дополнительной информации.

0

Ваш i здесь: setInterval(function(i) {... находится в области видимости функции setInterval(), что означает, что он не имеет никакого значения, потому что, когда функция обратного вызова вызывается внутри функции setInterval(), это не будет иметь никакого аргумента прошло.

В качестве параметра обратного вызова не нужно вставлять i в setInterval(). Просто удалите его, потому что вы уже можете получить доступ к i внутри самого цикла.

+0

ОК, я попробую это. – Mumfordwiz

Смежные вопросы