Нужны ли асинхронные действия в Node.js только при выполнении серверного приложения? - PullRequest
0 голосов
/ 20 октября 2018

Например, в приложении Node.js, которое я пишу, есть фрагмент кода вдоль этих строк, обернутый в функцию async:

await a(param1);
await b(param2);
await c(param3);
await d(param4);

Насколько я понимаю, было бы хорошо, если бы мойприложение было сервером, поэтому, например, пользователь 1, отправляющий запрос на мой сервер, может находиться на этапе await a(param1);, и, возможно, этот запрос занимает много времени, поэтому другой пользователь 2, находившийся на этапе await b(param2);, все еще может продолжить выполнениезапрос (не нужно ждать разрешения запроса пользователя 1).

Однако, если мое приложение использует только один пользователь, я не вижу никакого преимущества в использовании асинхронного кода, потому что использование await превращает асинхронный код в «синхронизацию», потому что функция b не будет работать до тех пор, пока a закончено.

Правильно ли мое понимание?


РЕДАКТИРОВАТЬ: функции a, b, c, d возвращают обещания, а следующее обещание зависит от предыдущего.

Ответы [ 2 ]

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

Целью асинхронного кода является не только предоставление возможности нескольким пользователям использовать приложение, но и одновременное выполнение нескольких задач в одном потоке.

Если один пользователь использует приложение (например, веб-сервер),пользователю могут потребоваться одновременные запросы.Браузеры могут делать одновременные запросы, и они делают их.Если код является синхронным и блокирующим, веб-сервер не будет отвечать до тех пор, пока синхронная процедура не будет завершена.

Даже если синхронный поток управления в настоящее время подходит для не-веб-приложений, нет никакой гарантии, что не будетнеобходимость переписать его на асинхронный в будущем.Пример - индикатор счетчика для приложения CLI.

Однако, если мое приложение использует только один пользователь, я не вижу никакого преимущества в использовании асинхронного кода, потому что использование await превращает асинхронный код в «синхронизацию», потому что функцияб не будет продолжаться, пока не закончится.

Только если a и т. Д. Возвращают обещания.Пропуск await приведет к одновременным и неконтролируемым обещаниям в этом случае.В любом другом случае await не меняет работу кода, за исключением того, что вводится задержка в один тик.

Как уже упоминалось в другом ответе, await является синтаксическим сахаром для then.Он не делает код синхронным, а выполняет операции обещания последовательно, подобно тому, как работает синхронный код.

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

Верно ли мое понимание?

Нет, если a, b, c и d возвращают обещания (неявно, потому что они также async функции, или явно), что, по-видимому, они делают, если вы используете await на них.async / await не делают асинхронный код синхронным (это невозможно), они позволяют вам писать ваш код в его логическом потоке, а не в временном потоке.

Если вы удалите эти await s, вы измените логику кода: вместо запуска a до завершения, затем b, затем c, затем d, будет начать все они, и все они будут перекрываться.Так что вместо этого:

const rnd = () => Math.floor(Math.random() * 800);

const runner = name => new Promise(resolve => {
  console.log(name + " start");
  setTimeout(() => {
    console.log(name + " end");
    resolve();
  }, rnd())
});

const a = () => runner("a");
const b = () => runner("b");
const c = () => runner("c");
const d = () => runner("d");

(async() => {
  await a();
  await b();
  await c();
  await d();
  console.log("after all calls");
})(); // In real code you'd catch errors
.as-console-wrapper {
  max-height: 100% !important;
}

Вы получите это:

const rnd = () => Math.floor(Math.random() * 800);

const runner = name => new Promise(resolve => {
  console.log(name + " start");
  setTimeout(() => {
    console.log(name + " end");
    resolve();
  }, rnd())
});

const a = () => runner("a");
const b = () => runner("b");
const c = () => runner("c");
const d = () => runner("d");

(async() => {
  a();
  b();
  c();
  d();
  console.log("after all calls");
})(); // In real code you'd catch errors
.as-console-wrapper {
  max-height: 100% !important;
}

Вероятно, это не то, для чего предназначен этот код, независимо от того, находится ли он на сервере или в однопользовательском приложении.

С точки зрения использования различных методов "Синхронизации" в Node.js (fs.readFileSync вместо fs.readFile и т. Д.), Тогда да, если вам не нужен процесс Node.js, чтобы делать что-то еще во время чтенияфайл (например, он не должен выполнять никакой другой обработки, такой как обработка других запросов в качестве сервера), вы можете использовать их в этой ситуации с однопользовательским приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...