История пабнуба; ждать ответа

Мне нужна помощь с историей 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();
Другие вопросы по тегам