В этом случае используется asyn c? Я пытаюсь понять событие l oop + обещание - PullRequest
0 голосов
/ 09 апреля 2020

Я составил здесь пример, чтобы попытаться лучше понять, как работает один поток + событие l oop + Обещание.

function add(a, b) {
  return new Promise(function(resolve, reject) {
    resolve(a + b);
  });
}

add(3, 6).then(v => console.log(v));
console.log('test 1');

В этом случае единственное, что я здесь делаю, это отправка add в конец очереди l oop события или она будет обработана в другом потоке?

Если это так, я просто отправляю в конец, поэтому я могу предположить, что использование Promise без http-вызова или любого другого веб-API-интерфейса бесполезно, верно?

Редактировать: я удалил asyn c, как указано @ twharmon

Ответы [ 3 ]

2 голосов
/ 09 апреля 2020

Единственное, что я здесь делаю, это отправляю add в конец очереди l oop, иначе она будет обработана в другом потоке?

Да, он не будет выполнять многопоточную обработку.

Но нет, он не отправляет add в конец события l oop. Он откладывает обратный вызов v => console.log(v), но add(3, 6) по-прежнему вызывается синхронно. И он даже не отправляет обратный вызов в конец события l oop, как после уже запущенных тайм-аутов, событий файловой системы и сети, а только в конец очереди микрозадач, которая выполняется почти сразу перед следующим поворот события l oop.

Могу предположить, что использование Promise без [выполнения чего-то действительно асинхронного] бесполезно

Да.

1 голос
/ 09 апреля 2020

Хорошо, поэтому я попытаюсь объяснить в соответствии с моим пониманием, я готов к обсуждению, и если я ошибаюсь, поправьте меня, пожалуйста:)

Так что в javascript есть только нить 1. И давайте просто поговорим о синхронном коде. Javascript начнется с первой строки кода и начнет выполнение всего кода syn c, например console.log(), airthmetic operations et c.

Если он сталкивается с любым асинхронным кодом c как setTimeout или promise, он будет откладывать этот код до тех пор, пока не будет запущен другой фрагмент кода.

Например, когда вы вызываете add(1,2).then(fn), создается обещание и обратный вызов fn из .then(fn) зарегистрирован двигателем времени выполнения. Движок времени выполнения переместится на следующую строку после add() и начнет выполнение любого синхронного кода. После выполнения всего синхронного кода будет вызван обратный вызов fn, если обещание add() разрешено.

Возьмем следующий пример:

function add(a, b) {
    return new Promise(function(resolve, reject) {
        resolve(a + b);
    });
}

add(3, 6).then(v => {
    throw new Error
});

while(1) {
    console.log("")
}

После add() называется, двигатель js движется к синхронному while l oop. Теперь это бесконечно, в то время как l oop означает, что очередь никогда не опустеет для выполнения обратного вызова add() обещания. Если бы это была многопоточная среда, обратный вызов add() выполнялся бы во втором потоке, вызывая и Error и останавливая программу, которая никогда не происходит из-за одного потока.

Теперь взглянем на второй пример:

function add(a, b) {
    return new Promise(function(resolve, reject) {
        setTimeout(() => {
            throw new Error
        }, 1000)
    });
}

add(3, 6).then(v => {
    console.log(v)
});

while(1) {
    console.log("")
}

Выполняя приведенный выше код, мы видим, что throw new Error никогда не вызывается, потому что наша программа снова застревает в бесконечности, пока l oop. Это означает, что код внутри обещания не выполняется (функция setTimeout), потому что, если бы это был какой-либо второй поток, строка throw new Error была бы названа остановкой программы. Механизм js создал обещание при вызове * 1034, отложил код обещания и перешел к следующей строке синхронного кода. Код внутри обещания будет вызван, когда очередь очистится, что в нашем примере никогда не произойдет из-за бесконечности, в то время как l oop.

Надеюсь, я имел смысл.

0 голосов
/ 09 апреля 2020

Нет, это не делает с тех пор; Вы можете удалить ключевое слово async из своего примера и все равно работать как задумано. Используйте async для функции, только когда тело функции имеет await.

В этом примере используется async / await:

function add(a, b) {
  return new Promise(function(resolve, reject) {
    resolve(a + b);
  });
}

async function run() {
  const sum = await add(3, 6);
  console.log(sum);
}

run()

. Вы можете использовать async / await, чтобы избежать использования .then() и .catch() с обратными вызовами. Для .catch() используйте try / catch:

try {
    const sum = await add(3, 6);
} catch (err) {
    // err will be what was passed to `reject()`, if anything.
    console.log(err)
}
...