2017-05-18 20 views
5

Tôi muốn sử dụng async chờ đợi trong một listener onMessage:chrome.runtime.onMessage phản ứng với async chờ

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

Tuy nhiên tôi nhận được xác định khi tôi gửi một tin nhắn.

Từ tài liệu cho chrome.runtime.onMessage.addListener:

Chức năng này trở nên không hợp lệ khi trở về sự kiện người nghe, trừ khi bạn trở thành sự thật từ các event listener để chỉ bạn muốn gửi một phản ứng không đồng bộ (điều này sẽ giữ cho kênh thông báo mở đến đầu kia cho đến khi sendResponse được gọi).

Tính năng này hoạt động khi tôi sử dụng gọi lại.

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

Tuy nhiên, tôi muốn tận dụng cú pháp chờ đợi. Nhưng nó không có vẻ để làm việc và vẫn trả về undefined:

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

Trả lời

0

Thành thực mà nói, có vẻ như mở rộng của Google Chrome không hỗ trợ từ khóa await. Tôi đã sử dụng thành công không đồng bộ chrome.runtime.onMessage.addListener 's trước, và mỗi khi tôi cố gắng sử dụng await Tôi thấy lỗi cú pháp này trong các công cụ Chrome Debugging, trên dòng mà tôi sử dụng await:

await not supported

Đây là cách tôi 've đã thử nghiệm:

tôi tạo ra một người biết lắng nghe rất cơ bản:

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

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

chức năng awaitTester của tôi trông như thế này:

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

    var awaited = await prom; 
    return awaited; 
} 

cuối cùng, người gửi thông điệp của tôi là những gì bạn mong muốn:

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

Và trong debugger/console Tôi luôn được undefined.

1

Tôi làm việc xung quanh bằng cách trích xuất thành một hàm không đồng bộ.

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

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

Giá trị trả về của hàm async được bọc hoàn toàn trong Promise.resolve. Xem doc.

Các vấn đề liên quan