Пойманный блок вводится до того, как "дождаться обещания" разрешен - PullRequest
0 голосов
/ 23 марта 2019

Попытка сохранить снимок камеры в Chrome. У меня есть рабочий код с использованием метода Promise.resolve (). Then (). Catch (), и я хочу преобразовать в async / await.

Оригинальный код:

function onSnapshotButtonClick() {
    imageCapture.takePhoto()
        .then(blob => createImageBitmap(blob))
        .then(imageBitmap => {
            drawCanvas(imageBitmap);
        })
        .catch(error => console.error("Snapshot failed."));
        console.log("Snapshot capture successful.");
})

Новый код:

var blob;
async function onSnapshotButtonClick() {
    // Take snapshot
    try {
        blob = await imageCapture.takePhoto();
        let imageBitmap = createImageBitmap(blob);
        drawCanvas(imageBitmap);
    } catch (error) {
        console.error("Snapshot failed.");
    }
    console.log("Snapshot successful.")

    // Do other stuff with blob...

})

Но при запуске кода выше я получаю оба «Снимок не удался». и «Снимок успешно выполнен». выводится на консоль, и ничто не обращается к холсту (эта функция была определена позже). Почему программа входит в блок catch, и не должна ли она выходить из функции, когда она это делает?

Редактировать: Спасибо, теперь я понимаю, что блок catch должен включать оператор return, и что я могу узнать больше об ошибке, напечатав error.message. Кажется, что imageBitmap не является допустимым форматом, и это вызывает проблему в версии async / await. Тогда остается вопрос, поскольку в оригинальной версии нет этой проблемы, что отличается в версии async / await, которая вызывает это изменение в поведении?

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Мое лучшее предположение, что ваш блок catch не имеет оператора return. Таким образом, даже если есть ошибка, и она обнаружена, все, что она делает, - регистрирует ваш «Снимок не удался» и продолжает запускать функцию. Попробуйте

try{
  ...
} catch(err){
    console.log("Snapshot failed: " + err)
    return;
}
//then do whatever it is you need if snapshot successful

Что касается причины ошибки, попробуйте зарегистрировать фактическую ошибку для лучшего понимания

1 голос
/ 23 марта 2019

Похоже, вы на самом деле не поняли, как работает блок try/catch(/finally).

В основном то, что вы кодируете, это (в псевдокоде):

Try this block :
    blob = await imageCapture.takePhoto();
    let imageBitmap = createImageBitmap(blob);
    drawCanvas(imageBitmap);
If any lines of the block above fails, then do this :
    console.error("Snapshot failed.");
After one of the 2 code blocks above are done, keep going

console.log("Snapshot successful.")

Итак, ваш *Блок 1007 * имеет исключения, переходит в блок catch, а затем продолжает.

Если вы хотите выполнить некоторую обработку вашего изображения, сделайте это в блоке try или return вcatch блок.

Вот некоторая документация по try/catch(/finally)

0 голосов
/ 23 марта 2019

catch предназначен не для обнаружения ошибок, а для обработки ошибок.После этого выполнение будет продолжено как обычно.Вы должны регистрировать «Снимок получен успешным» внутри try { ... } или внутри последнего .then(...) соответственно.

Почему программа входит в блок catch [вообще]?

Причина произошла ошибка.Вы узнаете, что такое error, если войдете в консоль.

...