2016-08-16 2 views
1

Мне нужна помощь с историей pubnub. Мне нужно восстановить последнее сообщение (объект) канала в JavaScript. Поэтому я делаю следующее:История pubnub; дождитесь ответа

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();" выполняется до того, как я получу ответ от функции обратного вызова. Есть ли способ заставить ожидание на обратном вызове?

+0

Нет. Вам необходимо использовать обратные вызовы или обещания. – SLaks

+0

Что это значит? – TheoryX

+0

http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

ответ

2

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

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(); 
+0

ОК, я не опубликовал весь код в примере, но это означает, что я должен поместить все в pubnub.history Перезвони? И со всем я имею в виду pubnub.subscribe, pubnub.publish и EventListeners? – TheoryX

+0

Это зависит от того, с чем связан ваш код. Скрипты, которые не имеют ничего общего с историей Pubnub, вы можете оставить на одном месте, но все, что зависит от результата обратного вызова, вы должны включить функцию обратного вызова. –

+0

@ TheoryX - Возможно, было бы более естественно создавать некоторые пользовательские функции для подписки, публикации и т. Д. И просто вызывать их непосредственно из своего обратного вызова истории или где бы вы ни находились. –