2016-06-14 4 views
0


Nach dem Lesen von Callback-Funktionen in JavaScript, habe ich einige Probleme bei der Umsetzung von ihnen. Hier ist mein Code-Schnipsel, die ich in meinem Hintergrund Seite nenne:Wie kann ich eine Gruppe von Anweisungen innerhalb einer Funktion synchron in Javascript aufrufen?

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

ich einen Screenshot von der Seite nehmen, um es zu dem Objekt hinzufügen. Ich füge dann dem Objekt eine weitere Eigenschaft hinzu und rufe dann die Callback-Funktion an.

Dies ist meine Callback-Funktion:

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

So nach der Syntax und Regeln von JavaScript, um den Wert von f in dem Rückruf sollte 1 sein, aber es ist null und es gibt keine Eigenschaft als Screenshot im Nachrichtenobjekt.

Ich möchte Screenshot vor Aufruf der Callback-Funktion machen, damit ich im Callback Screenshot haben kann.

Was mache ich falsch und wie kann dies behoben werden?

Antwort

1

Verschieben Sie den Rückruf in die Funktion captureVisibleTab. Als solche:

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

Um zu erklären, was hier geschieht:

Die function(dataUri) Erklärung ist die Callback-Funktion von captureVisibleTab. Indem wir unsere callback(message) hier hinein bewegen, weisen wir JavaScript an, callback(message) nur auszuführen, wenn captureVisibleTab abgeschlossen ist.

Vor, nach Ihrem Beispiel mit callback(message) außen und nach dem function(dataUri) Rückruf gemeint, dass wir callback(message)vor Abschluss der function(dataUri) verrichten, und daher Ihr Screenshot noch nicht vollständig verarbeitet wurde.

0

Lesen Sie über Verschlüsse in Javascript. Schließen Sie Ihre Anweisungen (die Sie synchron ausführen möchten) in Closures ein und platzieren Sie diese Closures dann in einem Callback. Sie werden synchron ausgeführt. Diese jsfiddle könnte Ihnen helfen fiddle

Jsfiddle 
+1

Es ist besser, Ihre Antwort hier sind, (über eine Geige kann ein schöner Bonus). Das einzige, was ich wirklich von Ihrer Antwort bekommen kann, ist "Verschlusssachen benutzen". – Teepeemm

Verwandte Themen