2016-06-14 4 views
0


JavaScriptでコールバック関数を読み取った後、私はそれらを実装するいくつかの問題に直面しています。ここで私は私の背景ページに呼び出しています私のコードスニペットです:関数内の文のグループをjavascriptで同期して呼び出す方法はありますか?

var f=0; 
function sendDataToServer(message,sender,callback) { 

    chrome.tabs.captureVisibleTab(null,{},function(dataUri){ 
     message['screenshot']=dataUri; 
     f=1; 
     console.log("here !"+message['screenshot']); // here screenshot works fine 
    }); 
    message['allLogs']=dataStore[sender.tab.id]; 
    callback(message); 
} 

私がオブジェクトに追加し、ページのスクリーンショットを取っています。次に、オブジェクトに別のプロパティを追加して、コールバック関数を呼び出しています。

これは私のコールバック関数です:だからはJavaScriptの構文と規則に従って、コールバックでFの値は1でなければなりません

sendDataToServer(message,sender,function (message) { 
    console.log(f); 
    for(var i in message){ 
     if(message.hasOwnProperty(i)) 
      console.log(i+' '+message[i]); 
     } 
    }); 
} 

が、それはゼロで、スクリーンショットなど全く性質がありませんメッセージオブジェクトに格納されます。

コールバック関数を呼び出す前にスクリーンショットを取りたいので、コールバックでスクリーンショットを取得できます。

私は間違っていますが、どうしたら修正できますか?

答えて

1

コールバックをcaptureVisibleTab関数内に移動します。そのように:

chrome.tabs.captureVisibleTab(null,{},function(dataUri){ 
    message['screenshot']=dataUri; 
    f=1; 
    console.log("here !"+message['screenshot']); // here screenshot works fine 

    message['allLogs']=dataStore[sender.tab.id]; 
    callback(message); 
}); 

は、ここで何が起こっているのかを説明するには、次の

function(dataUri)宣言はcaptureVisibleTabのコールバック関数です。ここにcallback(message)を移動すると、captureVisibleTabが完了した場合にのみcallback(message)を実行するようにJavaScriptに指示しています。

前に、外とfunction(dataUri)コールバック後callback(message)を持つ、あなたの例のように、私たちはfunction(dataUri)callback(message)前に完了したことを実行していた、そのため、あなたのスクリーンショットは、まだ完全に処理されなかったことを意味しました。

0

javascriptのクロージャについて読む。あなたのステートメント(同期的に実行したい)をクロージャに囲み、そのクロージャをコールバックに配置します。それらは同期して実行されます。このjsfiddleは、それは(オーバーフィドルに素敵なボーナスすることができます)、ここにあなたの答えを含める方が良いでしょうあなたfiddle

Jsfiddle 
+1

に役立つかもしれません。私が本当にあなたの答えから得ることのできる唯一のものは、 "クロージャを使う"です。 – Teepeemm

関連する問題