Saya mencoba menyampaikan pesan antara skrip konten dan ekstensi
Inilah yang saya miliki dalam skrip konten
chrome.runtime.sendMessage({type: "getUrls"}, function(response) {
console.log(response)
});
Dan dalam skrip latar belakang yang saya miliki
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.type == "getUrls"){
getUrls(request, sender, sendResponse)
}
});
function getUrls(request, sender, sendResponse){
var resp = sendResponse;
$.ajax({
url: "http://localhost:3000/urls",
method: 'GET',
success: function(d){
resp({urls: d})
}
});
}
Sekarang jika saya mengirim respons sebelum panggilan ajax dalam getUrls
fungsi, respons berhasil dikirim, tetapi dalam metode keberhasilan panggilan ajax ketika saya mengirim respons, ia tidak mengirimnya, ketika saya masuk ke debugging saya bisa melihat bahwa porta null di dalam kode untuk sendResponse
fungsi.
Jawaban:
Dari dokumentasi untuk
chrome.runtime.onMessage.addListener
:Jadi, Anda hanya perlu menambahkan
return true;
setelah panggilangetUrls
untuk menunjukkan bahwa Anda akan memanggil fungsi respons secara tidak sinkron.sumber
<blink>
dan<marquee>
menandai suatu halaman.Jawaban yang diterima benar, saya hanya ingin menambahkan kode sampel yang menyederhanakan ini. Masalahnya adalah bahwa API (dalam pandangan saya) tidak dirancang dengan baik karena memaksa kita pengembang untuk mengetahui apakah pesan tertentu akan ditangani async atau tidak. Jika Anda menangani banyak pesan berbeda, ini menjadi tugas yang mustahil karena Anda tidak pernah tahu apakah jauh di dalam suatu fungsi, sebuah sendResponse yang diteruskan akan disebut async atau tidak. Pertimbangkan ini:
Bagaimana saya bisa tahu apakah
handleMethod1
panggilan itu async atau tidak? Bagaimana seseorang yang memodifikasihandleMethod1
tahu bahwa itu akan merusak penelepon dengan memperkenalkan sesuatu async?Solusi saya adalah ini:
Ini secara otomatis menangani nilai kembali, terlepas dari bagaimana Anda memilih untuk menangani pesan. Perhatikan bahwa ini mengasumsikan bahwa Anda tidak pernah lupa memanggil fungsi respons. Perhatikan juga bahwa kromium dapat mengotomatisasi ini untuk kita, saya tidak mengerti mengapa mereka tidak melakukannya.
sumber
chrome.extension.onRequest
/chrome.exension.sendRequest
berlaku persis seperti yang Anda gambarkan. Metode ini sudah usang karena ternyata banyak pengembang ekstensi TIDAK menutup port pesan. API saat ini (membutuhkanreturn true
) adalah desain yang lebih baik, karena kegagalan hard lebih baik daripada bocor secara diam-diam.return true;
. Itu tidak mencegah port dari dibersihkan jika panggilan disinkronkan, sementara panggilan async masih diproses dengan benar. Kode dalam jawaban ini memperkenalkan kompleksitas yang tidak perlu tanpa manfaat yang jelas.Anda dapat menggunakan perpustakaan saya https://github.com/lawlietmester/webextension untuk menjadikan ini berfungsi di Chrome dan FF dengan cara Firefox tanpa panggilan balik.
Kode Anda akan terlihat seperti:
sumber