Javascript await никогда не завершается sh, если не заключен во второе обещание - PullRequest
0 голосов
/ 09 июля 2020

Я пишу небольшой скрипт, используя Electron, который вызывает Python скрипт, чтобы сделать снимок экрана окна вместе с записью на текстиль. У меня проблема, когда ожидаемая функция работает не так, как задумано. У меня есть функция-оболочка для функции Vanilla JS setTimeout, чтобы преобразовать ее в обещание.

function wait(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}

Эта функция отлично работает сама по себе, и раньше я использовал ее в других программах без каких-либо вопросы. В этом случае я пытаюсь l oop определенное количество раз и жду установленное время в пределах каждого l oop. Это поведение работает должным образом, если я вызываю wait() в другом обещании (и в данном случае в событии ipc.once). Однако, если я вызываю его за пределами обещания, он вместо этого никогда не завершает l oop и просто зависает.

Я не могу понять, почему происходит такое поведение, и я отправил несколько часов, пытаясь понять он вышел, но безрезультатно.

async function takeScreenshot(numPhotos) {
    let stream = fs.createWriteStream("labels.manifest", { flags: "a" });

    for (let i = 0; i < numPhotos; i++) {
        await wait(500);

        await new Promise((resolve, reject) => {
            // Wait for the front-end script to send the labels
            ipc.once("sendLabels", async (event, data, err) => {
                if (err) reject(err);

                writeManifest(i, stream, data); // Write the manifest file with the given labels
                spawn("python", ["screenshot.py", i.toString()], {
                    cwd: process.cwd(),
                    detached: true,
                    stdio: "inherit",
                }); // Call the python screenshot script
                resolve(); // Resolve the promise
            });
        });
        await win.reload();
    }
}

В этом коде с ожиданием вне ipc.once он не будет завершен по какой-либо причине.

Если кто-то может пролить немного Свет, почему это происходит, я был бы очень признателен!

...