История пабнуба; ждать ответа
Мне нужна помощь с историей pubnub. Я должен получить последнее сообщение (объект) канала в JavaScript. Поэтому я делаю следующее:
var vrednosti = {};
var debug = 1;
getHistory = function(){
pubnub.history({
channel: settings.channel,
callback: function(m){
var msg = m[0];
var obj = msg[0];
for (var key in obj){
if (Object.prototype.hasOwnProperty.call(obj, key)){
if(inputs[key].id=='door') inputs[key].checked = vrednosti[key] = obj[key];
else inputs[key].value = vrednosti[key] = obj[key];
if(debug) console.log("history:",vrednosti)
}
}
},
count : 1,
});
}
getHistory();
console.log("recorded history in var vrednosti!", vrednosti)
setTimeout(function(){
if(debug) console.log("recorded history in var vrednosti!", vrednosti)
}, 1000);
Так что это дает следующий результат:
recorded history in var vrednosti! Object { }
history: Object { door: true }
history: Object { door: true, lightLiving: "844" }
history: Object { door: true, lightLiving: "844", lightPorch: "395" }
recorded history in var vrednosti! Object { door: true, lightLiving: "844", lightPorch: "395" }
Так что проблема в том, что код после "getHistory();" выполняется, прежде чем я получу ответ от функции обратного вызова. Есть ли способ заставить ожидание при обратном вызове?
1 ответ
Решение
Обратные вызовы асинхронны. Это означает, что вы должны переместить весь код, после которого вы хотите выполнить, в функцию обратного вызова.
var vrednosti = {};
var debug = 1;
getHistory = function(){
pubnub.history({
channel: settings.channel,
callback: function(m){
var msg = m[0];
var obj = msg[0];
for (var key in obj){
if (Object.prototype.hasOwnProperty.call(obj, key)){
if(inputs[key].id=='door') inputs[key].checked = vrednosti[key] = obj[key];
else inputs[key].value = vrednosti[key] = obj[key];
if(debug) console.log("history:",vrednosti)
}
}
console.log("recorded history in var vrednosti!", vrednosti)
setTimeout(function(){
if(debug) console.log("recorded history in var vrednosti!", vrednosti)
}, 1000);
},
count : 1,
});
}
getHistory();