2017-05-18 39 views
5

chcę użyć asynchronicznie czekają w słuchacza onMessage:odpowiedź chrome.runtime.onMessage z async czekają

chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{ 
    var key = await getKey(); 
    sendResponse(key); 
}); 

Jednak mam niezdefiniowany kiedy wysłać wiadomość.

Z dokumentacji chrome.runtime.onMessage.addListener:

Ta funkcja staje się nieważny, gdy powraca detektora zdarzeń chyba wrócisz prawda od słuchacza zdarzeń wskazania chcesz wysłać odpowiedź asynchronicznie (spowoduje to, że kanał wiadomości będzie otwarty na drugi koniec, dopóki nie zostanie wywołany sendResponse).

Działa to, gdy używam wywołania zwrotnego.

chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{ 
    getKey(key => { 
     sendResponse(key); 
    }); 
    return true; 
}); 

Chciałbym jednak wykorzystać oczekiwaną składnię. Ale nie wydaje się do pracy i nadal zwraca niezdefiniowane:

chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{ 
    var key = await getKey(); 
    sendResponse(key); 
    return true; 
}); 

Odpowiedz

0

Szczerze mówiąc, wygląda na to, Google Chrome Extensions nie obsługują słowa kluczowego await. Mam powodzeniem stosowane asynchroniczny chrome.runtime.onMessage.addListener „s przed i za każdym razem staram się korzystać await widzę ten błąd składni w narzędziach Chrome debugowania na linii że używam await:

await not supported

Oto jak ja już zostały testowania:

stworzyłem bardzo podstawowe słuchacza:

chrome.runtime.onMessage.addListener(function(data, MessageSender, sendResponse) { 
    sendResponse(awaitTester); 
    var async = true; 

    // returns true if asyncronous is needed 
    if (async) return true; 
}); 

awaitTester moja funkcja wygląda tak:

function awaitTester() { 
    var prom = new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      resolve('test'); 
     }, 4000); 
    }); 

    var awaited = await prom; 
    return awaited; 
} 

wreszcie moja wiadomość nadawca jest to, czego można się spodziewać:

chrome.runtime.sendMessage({}, function(message) { 
    debugger; 
    console.log(message); 
}); 

A w debugger/konsoli zawsze dostać undefined.

1

Robię obejście przez wyodrębnianie do funkcji asynchronicznej.

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { 
    doSomethingWith(request).then(sendResponse); 
    return true; 
}); 

async function doSomethingWith(request) { 
    var key = await getKey(); 
    // await ..... 
    return key; 
} 

wartość powrotu funkcji async niejawnie owinięty w Promise.resolve. Zobacz doc.