2016-01-08 2 views
-2

Я хочу, чтобы иметь возможность сделать console.log (ключ); делать журнал каждые 5 секунд, в настоящий момент нет задержки, и все данные регистрируются одновременно.Создайте задержку внутри a для каждого цикла

//the location of my usres table 
    var ref = new Firebase('https://myapp.firebaseIO.com/users/'); 

//ask fire base to get the records just once 
    ref.once("value", function (snapshot) { 

//loop through the retuned records 
    snapshot.forEach(function (childSnapshot) { 

// get just the value for the key 
     var key = childSnapshot.key(); 

// log the key - this will be changed to send the value to another function 
     console.log(key); 

    }); 
}) 

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

+0

Вы должны будете использовать 'setInterval()' - см http://stackoverflow.com/questions/18070659/run-javascript-function-at-regular -time-interval –

+0

Пробовал без радости – Bill

+0

Что это за цель? Это выглядит очень искусственно. См. [Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378). Возможно, сэкономить много времени, объяснив, чего вы на самом деле пытаетесь достичь. – Kato

ответ

0

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

/* 
 
* makeTimedForEach 
 
* 
 
* this will create an array itererator that will loop through an array 
 
* at a specified timeout delay. 
 
* 
 
* @param {array} arr array to iterate 
 
* 
 
* @returns {Function} function to pass in callback and delay 
 
*/ 
 
function makeTimedForEach(arr) { 
 
    return function timedForEach(fn, delay) { 
 
    var ii = 0; 
 
    function iterate() { 
 
     if (ii < arr.length) { 
 
     // call the callback injecting the current element, index and array like native forEach 
 
     fn.call(arr[ii], arr[ii], ii, arr); 
 

 
     ii++; 
 
     // call iterate again 
 
     setTimeout(iterate, delay); 
 
     } 
 
    } 
 
    // call for the first time you could add a setTimout here 
 
    // if you needed a delay at the start 
 
    // setTimeout(iterate, delay); 
 
    iterate(); 
 
    } 
 
} 
 

 
// Snapshot mock 
 
function Snapshot(key) { 
 
    this._key = key; 
 
} 
 
Snapshot.prototype = { 
 
    key: function(){ 
 
    return this._key; 
 
    } 
 
} 
 

 

 
var 
 
    // a mock of the snapshot you get returned from `new FireBase` 
 
    snapshot = [new Snapshot('one'), new Snapshot('two'), new Snapshot('three')], 
 
    // create the iterator 
 
    snapshotTimedForEach = makeTimedForEach(snapshot); 
 

 
// call the iterator passing in the callback and the delay time 
 
snapshotTimedForEach(function(childSnapshot, ii, arr) { 
 
    console.log(childSnapshot.key(), childSnapshot, ii, arr); 
 
}, 1000);
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>

original answer:

Я не уверен, если это то, что вам нужно, я не могу видеть точку в регистрации тот же результат через каждые 5 секунд. Кажется, вы можете опрашивать firebase API каждые 5 секунд

var ref = new Firebase('https://myapp.firebaseIO.com/users/'); 
 
ref.once("value", function(snapshot) { 
 
    snapshot.forEach(function(childSnapshot) { 
 

 
    var key = childSnapshot.key(); 
 

 
    // you can use setTimeout that recursively calls itself, 
 
    // setTimeout will run the callback after the time has passed 
 
    // and wont lock up your thread like setInterval 
 
    function log() { 
 
     console.log(key); 
 
     setTimeout(log, 5000); 
 
    } 
 
    // call log for the first time 
 
    setTimeout(log, 5000); 
 

 
    }); 
 
})

+0

Я пробовал, но журнал записывает все данные на консоль одновременно без задержки – Bill

+0

, что странно. дайте мне секунду, я буду использовать некоторые фиктивные данные. на самом деле во второй раз вы хотели, чтобы итерация через forEach каждые 5 секунд задерживала консольный журнал в течение 5 секунд, а затем продолжалась каждые 5 секунд. – synthet1c

+0

Для каждого из них возвращаются тысячи идентификаторов пользователя, если я передаю все идентификаторы пользователя следующей функции, сценарий взорвется, поэтому я думаю, что через каждые 5 секунд идентификатор переходит к следующей функции, что даст следующую функцию много времени для завершения. – Bill

0
var ref = new Firebase('https://myapp.firebaseIO.com/users/'); 

ref.once("value", function (snapshot) { 

    for(var i=0; i<snapshot.lenght;i++){ 
     var childSnapshot = snapshot[i]; 

     var key = childSnapshot.key(); 

     setTimeout(function() { 
      console.log(key); 
     }, 5000); // will stop the loop for 5 seconds every time 
    } 


}); 
+0

Я попытался, но журнал записывает все данные на консоль одновременно без задержки. – Bill

+0

Вместо функции .forEach. попробуйте использовать обычный цикл; Я не могу дать вам этот ответ, но в качестве предложения, поскольку в прошлом у меня была подобная проблема, использующая цикл forEach в DOM, и с использованием normal for loop исправил мою проблему. Я не могу сказать, почему и как это произошло, так как я не искал дальше. – wmehanna

+0

Я так настроен в моих путях с каждым циклом, я даже не вижу, как его изменить для цикла for! Любые указатели были бы замечательными – Bill

0

Вы можете использовать SetTimeout и рекурсивную функцию следующим образом:

function values(obj) { 
    if (obj instanceof Array) { 
     return obj.slice(); 
    } else { 
     return Object.keys(obj).map(function(key) { 
      return obj[key]; 
     }); 
    } 
} 

ref.once("value", function (snapshot) { 
    var array = values(snapshot.val()); 
    (function process() { 
     var item = array.shift(); 
     if (item) { 
      var key = item.key(); 
      console.log(key); 
      setTimeout(process, 5000); 
     } 
    })(); 
}); 
+0

Я пробовал выше, и я получаю FIREBASE ПРЕДУПРЕЖДЕНИЕ: Исключение было вызвано обратным вызовом пользователя. TypeError: snapshot.slice не является функцией – Bill

+0

@Bill попробуйте 'snapshot.val(). Slice()' – jcubic

+0

FIREBASE ПРЕДУПРЕЖДЕНИЕ: Исключение было вызвано обратным вызовом пользователя. TypeError: snapshot.val (...). Slice не является функцией – Bill

1

Использование closure получить значение key текущей итерации после setTimeout

Попробуйте это:

var ref = new Firebase('https://myapp.firebaseIO.com/users/'); 
ref.once("value", function(snapshot) { 
    snapshot.forEach(function(childSnapshot, index) { 
    var key = childSnapshot.key(); 
    setTimeout((function(key) { 
     return function() { 
     console.log(key); 
     } 
    })(key), 5000 * index); 
    }); 
}); 
+0

Я пробовал, но журнал записывает все данные на консоль одновременно без задержки – Bill

+0

Проверьте обновление ... – Rayon

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