2016-08-16 16 views
1

私はpubnubの履歴に関する助けが必要です。私はJavaScriptのチャネルの最後のメッセージ(オブジェクト)を取得する必要があります。だから私は、次の手順に従ってください:だから問題は、後にそのコードですpubnubの履歴;応答を待つ

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();":

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); 

をこれは、次の結果を生成します私はコールバック関数から答えを得る前に実行されます。コールバックで待機を強制する方法はありますか?

+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

ok、私は例ではコード全体を投稿しませんでしたが、これはpubnub.historyの中にすべてを入れなければならないことを意味します折り返し電話?そして、私はpubnub.subscribe、pubnub.publish、EventListenersのすべてを意味しますか? – TheoryX

+0

それはあなたの他のコードが関連しているかによって異なります。あなたは同じ場所に置くことができるPubnubの履歴とは関係のないスクリプトですが、コールバックの結果に依存するものはすべてコールバック関数に入れなければなりません。 –

+0

@TheoryX - 購読、公開などのためのカスタム関数を作成し、ヒストリコールバックから直接呼び出したり、必要に応じてどこからでも呼び出すことが自然になるかもしれません。 –