2016-08-06 18 views
1

Ich habe eine Funktion, die durch chrome.storage.sync.get auf einen gespeicherten Wert überprüft und eine CSS-Datei bei Vorhandensein des gespeicherten Werts einfügen.Holen Sie den Rückgabewert von Async-Funktion in Javascript

Ich realisiere chrome.storage.sync.get ist eine asynchrone Funktion und der Rückgabewert wird nicht wie erwartet an die makeAggressive()-Funktion übergeben. Wie auch immer, ich weiß nicht, wie ich diesen Code schreiben soll, um das Ergebnis if (result == 'aggressive') an makeAggressive() zu übergeben.

Wie kann ich den gespeicherten Wert abrufen, seinen Wert überprüfen und das Ergebnis an die aufrufende Funktion zurückgeben?

chrome.tabs.onUpdated.addListener(function(tabId, info, tab) { 
    if (info.status == 'complete') applyCSS(tab); 
}); 

function applyCSS(tab) { 
    var tabUrl = tab.url; 

    if (makeAggressive()) { 
     chrome.tabs.insertCSS(tab.id, { 
      file: "aggressive.css" 
     }); 
    } 
} 

function makeAggressive() { 
    chrome.storage.sync.get(function(items) { 
     var result = items.intensityLevel; 
     if (result == 'aggressive') { 
      return true; 
     } 
    }); 
} 
+2

Mögliches Duplikat [? Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren] (http://stackoverflow.com/questions/14220321/how-do- i-return-the-response-from-async-call) – Makyen

Antwort

1

Einfach einen Rückruf in die asynchrone Funktion übergeben.
Der Rückruf soll aufgerufen werden, sobald die asynchrone Aktivität abgeschlossen ist.

async_function(function() { 
    // do something after async_function completes and invokes this callback 
}); 

function async_function(callback) { 
    something_async(function(result) { 
     callback(result); 
    }); 
} 

In Ihrem Fall:

function applyCSS(tab) { 
    var tabUrl = tab.url; 

    makeAggressive(function() { 
     chrome.tabs.insertCSS(tab.id, { 
      file: "aggressive.css" 
     }); 
    }); 
} 

function makeAggressive(callback) { 
    chrome.storage.sync.get(function(items) { 
     var result = items.intensityLevel; 
     if (result == 'aggressive') { 
      callback(); 
     } 
    }); 
} 
+1

Das funktionierte, obwohl ich mich um Callbacks kümmern muss, um zu verstehen, WARUM das funktionierte! – zeeshan

+0

Lesen Sie die Antwort der verknüpften doppelten Frage oder finden Sie ein anderes Tutorial. – wOxxOm