LINUXTALKS.CO

Кто соображает в js. Как это делается?

 

L


0

1

Залип, как дождаться event и решить промис только после этого event?

<script type="module">
    const sqlw = new Worker("...");
    sqlw.init = async ( w, e ) => {
        w.postMessage( { type: "open", messageId: "open", args: e } );
        w.onmessage = ( e ) => {
            if ( e.data.type === "sqlite3-api" && e.data.result === "worker1-ready" ){
                // ??????
            }
        };    
    }
    let e = await sqlw.init( sqlw, {filename: "test.db", flags: "cw", vfs: "opfs"} );
</script>
★★★
Ответ на: комментарий от kevlarbeaver

Хуйня или годно?

    sqlw.init = async ( w, e ) => {
        let x = undefined;
        w.postMessage( { type: "open", messageId: "open", args: e } );
        w.onmessage = ( e ) => {
            x = e;
        }
        return new Promise( resolve => {
            setTimeout( () => { x !== undefined ? resolve( x ) : x = undefined; }, 200 );
        });
    }
Anoxemian    
★★★
Anonymous / Unknown (EE)
Ответ на: комментарий от Anoxemian

Отредактировал изначальный код:

<script type="module">
    const sqlw = new Worker("...");
    sqlw.init = (w, e) => {
        return new Promise((resolve) => {
            w.postMessage( { type: "open", messageId: "open", args: e } );
            w.onmessage = ( e ) => {
                if ( e.data.type === "sqlite3-api" && e.data.result === "worker1-ready" ){
                    resolve(e.data);
                }
            };    
        });
    };
    let e = await sqlw.init( sqlw, {filename: "test.db", flags: "cw", vfs: "opfs"} );
</script>
kevlarbeaver    
★★
Mac OS / Chrome (DE)
Ответ на: комментарий от kevlarbeaver

Ну и до кучи, а в чем разница между

return new Promise((resolve) => {
    w.postMessage( { type: "open", messageId: "open", args: e } );
    w.onmessage = ( e ) => { ... };    
});

и

w.postMessage( { type: "open", messageId: "open", args: e } );
return new Promise((resolve) => {
    w.onmessage = ( e ) => { ... };    
});
Anoxemian    
★★★
Anonymous / Unknown (EE)
Ответ на: комментарий от Anoxemian

Еще вопрос, а как можно прибить функцию к объекту, типа

Не очень понял, в чём вопрос. Ну типа ты вызываешь bind с аргументами на функции, - в итоге получаешь функцию с уже прибиндиными аргументами. Или что нужно?

const init = sqlw.init.bind(sqlw, { filename: "test.db", flags: "cw", vfs: "opfs" });
let ready = await init();
console.log(ready);

Ну и до кучи, а в чем разница между

Концептуально оба варианта неправильные. Не столь важно, что postMessage находится внутри промиса, проблема тут в том, что если postMessage находится до подписки на событие (onmessage), то есть мизерная вероятность, что он успеет отработать до подписки - и ты ответа не получишь. Хотя, скорее всего, на практике твой код будет работать корретно просто из-за задержек сети, но лучше переписать как-то так:

return new Promise((resolve) => {
    w.onmessage = ( e ) => { ... }; 
    w.postMessage( { type: "open", messageId: "open", args: e } ); 
});

или так:

const p = new Promise((resolve) => {
    w.onmessage = ( e ) => { ... };    
});
w.postMessage( { type: "open", messageId: "open", args: e } );
return p;

Я просто местами поменял вызов postMessage и подписку на событие onmessage.

kevlarbeaver    
★★
Windows / Chrome (DE)
Ответ на: комментарий от kevlarbeaver

Ага, спасибо, кажется, вкурил.

Или что нужно?

По сути хочу как-то пофиксить прототип объекта, в данном случае воркера, добавить функций всяких, чтобы изнутри к самому воркерку можно было обращаться через this или еще как. Ну как-то глаз режет сама нотация sqlw.init( sqlw... ощущение сабя дегенератом прямо когда такое высираешь.

Anoxemian    
★★★
Anonymous / Unknown (EE)