จะเพิ่มคลาสเนทีฟใหม่ในบริบทของ WebWorker ใน JavaScriptCore ได้อย่างไร


102

ฉันมีแอปพลิเคชันที่ขยาย JavaScript ผ่าน JavaScriptCore ในเบราว์เซอร์ webkit-gtk ตอนนี้ฉันมีหลายคลาสที่ฉันเพิ่มเข้าไปในบริบทส่วนกลางดังนี้:

void create_js(gpointer context, char* className, JSClassDefinition clasDefinition) {
    JSClassRef classDef = JSClassCreate(&clasDefinition);
    JSObjectRef classObj = JSObjectMake(context, classDef, context);
    JSObjectRef globalObj = JSContextGetGlobalObject(context);
    JSStringRef str = JSStringCreateWithUTF8CString(className);
    JSObjectSetProperty(context, globalObj, str, classObj, kJSPropertyAttributeNone, NULL);
    JSStringRelease(str);
}

ตอนนี้ฉันต้องการเพิ่มชั้นเรียนเหล่านั้นในบริบทของ WebWorker ด้วยดังนั้นฉันจึงสามารถเรียกพวกเขาจากคนงานที่สร้างอินสแตนซ์ใน JS ได้

ฉันได้ลองรับWorkerวัตถุแล้ว:

JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);

แต่สิ่งนั้นจะเพิ่มเข้าไปในWorkerConstructorวัตถุและเมื่อnew Worker()เรียกใช้คลาสจะไม่พร้อมใช้งาน


1
ไม่แน่ใจเกี่ยวกับความต้องการของคุณอย่างแน่นอน แต่ฉันคิดว่าเราสามารถรวมสคริปต์เดียวซึ่งทำสิ่งนี้ในไฟล์ผู้ปฏิบัติงานได้ แบบนี้. importScripts ("globalWorker.js")
rajesh

1
คุณกำลังวางคลาส Worker ไว้ในบริบทส่วนกลางคุณควรเพิ่มลงในบริบทของ WebWorker ไม่ใช่บริบทหลักเนื่องจากทั้งสองบริบทแตกต่างกัน
Karim H

4
คุณกำลังพยายามเพิ่มคลาสที่สร้างขึ้นใหม่ในWorkerนิยามคลาส โดยปกติคุณต้องเพิ่มคลาสของคุณไปยัง Global object และใน Global Object ทุกตัวภายใน JSVirtualMachine ที่สร้างขึ้นใหม่ Workerจะสร้างสิ่งใหม่ที่JSVirtualMachineมีบริบทส่วนกลางและวัตถุระดับโลก สภาพ
แวดล้อมที่

คำตอบ:


1

ไม่มีวิธีใดในการแก้ไขWorkerGlobalScopeขอบเขต / บริบทที่เทียบเคียงได้ก่อนที่ผู้ปฏิบัติงานเว็บจะเริ่มทำงานในการใช้งานเบราว์เซอร์ทั่วไปส่วนใหญ่ ขอบเขตเหล่านี้จะใช้ได้เฉพาะกับบริบทของผู้ปฏิบัติงานเว็บทันทีที่เปิดตัวผู้ปฏิบัติงานเว็บรายนี้

วิธีเดียวที่จะใช้วิธีการที่ใช้ร่วมกันคือการกำหนดไว้ในไฟล์ / ทรัพยากรที่ใช้ร่วมกันแยกต่างหากและรวมไว้โดยใช้ importScripts()

self.importScripts('foo.js');
self.importScripts('foo.js', 'bar.js', ...);
importScripts('foo.js');
importScripts('foo.js', 'bar.js', ...);

หมายเหตุ: importScripts()และself.importScripts()มีประสิทธิภาพเทียบเท่ากัน - ทั้งคู่แสดงถึงimportScripts()การถูกเรียกจากภายในขอบเขตภายในของคนงาน


แหล่งที่มา


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.