Асинхронная функция Javascript ожидает ответа без ожидания - PullRequest
0 голосов
/ 07 октября 2018

Я новичок в концепции асинхронного поведения JavaScript.

Приведенный ниже код сбивает меня с толку.В соответствии с моей концепцией, функция b должна возвращаться до завершения функции ожидания, потому что я не говорю об ожидании, используя 'await'.Но вывод, который я получаю, таков: до , затем он ждет в течение 6 секунд после после b

ожидаемый вывод: до после после b без ожидания в течение 6 секунд Вот код:

function wait(ms)
{

  var start = new Date().getTime();

  var end = start;

  while(end < start + ms) {    

    end = new Date().getTime();

    }
}

async function b () {
  console.log('before');
  wait(6000);
  console.log('after');
}

async function c () {
b()
console.log('after b');
}

c();

Пожалуйста, помогите мне лучше понять эту концепцию

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Пожалуйста, посмотрите этот пример: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function.

Как уже говорилось, ключевое слово async позволяет использовать await.Технически это делает немного больше, но давайте пока оставим это без внимания.

В примере показан Promise (который допускает асинхронное программирование), для которого функция async await s разрешается до того, как будет продолжена,По сути, await позволяет писать синхронный код при работе с асинхронными функциями.

Попробуйте поиграть с примером (например, удалить await).Это приведет к тому, что код не будет ждать обещания и будет возвращать обещание вместо значения разрешения обещания.

Если вы хотите погрузиться в асинхронное программирование, лучше всего погрузиться в Promise s.Они предоставляют вам интерфейсы для этого.

Концепция довольно проста.Вы выполняете некоторую работу и вызываете функцию обратного вызова (либо решаете при успехе, либо отклоняете при неудаче), когда делаете.Понимание интерфейса может быть немного сложнее, но MDN имеет отличную документацию: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise.

0 голосов
/ 07 октября 2018

Это очень легко понять.Функция wait() является синхронной.

Ключевое слово async не делает функцию асинхронной.Он позволяет использовать только ключевое слово await внутри функции, отмеченной async.


Так как же узнать, является ли функция асинхронной или синхронной?Самый простой способ - прочитать документы.

В Javascript практически отсутствуют функции, которые могут сигнализировать вам, является ли функция синхронной или асинхронной.Даже существование обратных вызовов не является сигналом.Например, Array.prototype.sort() принимает обратный вызов, но полностью синхронен.Ключевое слово async является хорошим шагом в правильном направлении, которое может сигнализировать о том, что функция является асинхронной, но, как вы сами продемонстрировали, это зависит от того, понимает ли автор функции, что делает ключевое слово async.

Положительным моментом является то, что документация в javascript, как правило, очень хороша в отличие от других языков, таких как Java или C ++, потому что обычно нет автоматической документации (даже если вы используете автоматическую систему документации в js, вам нужно вручную написать для нее комментарии).Существует общая культура написания подробной и понятной документации в файлах README, так что npm забирает ее для пользователей библиотек.


Итак, как можно написать асинхронную функцию в javascript?

Обычно есть только два способа сделать это:

  1. Использовать асинхронную функцию.Например, setTimeout() или fetch():

    function waitOneSecond () {
        return new Promise(functionn (ok,err) {
            setTimeout(ok,1000);
        });
    }
    
  2. Запишите его в C. Для node.js вы можете использовать API Addons для реализации модулей в C / C ++ (https://nodejs.org/api/addons.html), В Chrome есть NaCl (https://developer.chrome.com/native-client) и т. Д.). Так были реализованы такие функции, как setTimeout(), fetch() и т. Д.

...