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

Теперь возникает вопрос: зачем нужна ожидаемая функция? Рассмотрим следующую ситуацию.

  • Предположим, вы вводите динамические данные на сайт. В этом случае вам нужно получить данные из базы данных или любого другого API. Получение данных занимает некоторое время. Таким образом, выполнение функции должно ждать, пока данные не будут извлечены.

Это выглядит теоретически? Позвольте мне подробнее остановиться на этом.

Например, представьте, что вы имеете дело с чтением и записью файлов с помощью модуля fs по умолчанию для узла. Рассмотрим следующий фрагмент кода:

Что будет делать этот код? Он прочитает файл, расположенный по пути . Проверьте подробнее об этой функции здесь.

Что вы думаете? Что будет на выходе этого кода? Если вы думали, что это будет значение data, то ошибались! Он выведет на консоль null из-за неблокирующего характера функции узла.

Это неприемлемо, не правда ли? Поскольку сначала будет вызываться temp (), затем temp () вызовет getData (). Теперь getData () вызовет readfile () и присвоит значение data на val, а затем после вывода val в консоль. Теперь это происходит из-за неблокирующего характера readfile (), что означает, что выполнение функции не будет ждать, пока чтение файла не будет не завершен. Он перейдет к следующему блоку, и файл чтения будет работать параллельно с ним. Следовательно, будет напечатано null (поскольку чтение файла займет некоторое время).

Теперь, чтобы избавиться от этого, сделайте функцию getData () как ожидаемую. Как это сделать? Вот способы сделать это:

  1. Использование ‘Promises
  2. Использование библиотеки ‘util’ в Node.js

Использование обещаний

В этом методе вы должны вернуть обещание из функции. Рассмотрим следующий фрагмент кода:

Мы вернули Promise из функции getData (). Теперь нам нужно дождаться завершения чтения файла. Следовательно, мы использовали ключевое слово await внутри функции async temp (), которая заставит temp (), чтобы дождаться, пока Promise не будет оценен, а затем назначит данные на val.

Примечание: будьте осторожны при использовании ключевого слова async, оно заставит функцию ждать, а не выполнение кода означает, что если вы написали какой-то код после функции temp (), то это не приведет к принудительному выполнению следующего блока кода. ждать. Если хотите, используйте синхронную версию. проверьте это здесь.

Теперь вы получите то, что хотите, и ваша веб-страница не будет показывать неожиданный результат 🙂

Давайте посмотрим на другой метод.

Использование библиотеки «util» в Node.js

Рассмотрим следующий фрагмент кода:

promisify () принимает функцию в качестве параметра и возвращает обещанную версию этой функции. Узнайте больше о promisify () здесь.

Второй подход кажется простым, не правда ли? (Поскольку люди всегда пытаются найти ярлыки 🙂). Но основная концепция должна быть в вашем уме.

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

Вот некоторые справочные материалы, если вы хотите в них глубоко погрузиться:

  1. Https://nodejs.org/api/util.html#util_util_promisify_original
  2. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Удачного развития!