Действия Actionhero возвращаются немедленно - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь понять основную концепцию ActionHero async / await и поражаю множество стен. По сути, в действии, почему это возвращается немедленно, а не через 500 мс?

async run (data) {
  setTimeout(() => data.response.outcome = 'success',500)
}

Уточняющее редактирование: этот вопрос был больше о процессе асинхронного выполнения и выполнения обещаний, чем о буквальном использовании setTimeout (). Это не совсем относится к ActionHero, но именно по этой схеме AH использует мое первое знакомство с концепциями. В представленном ответе поясняется, что некоторые функции должны быть заключены в обещание, чтобы их можно было ожидать, и что для этого есть несколько способов.

1 Ответ

0 голосов
/ 27 апреля 2018

Потому что вы не дожидались его окончания.

В основном вам нужно дождаться setTimeout.

async run (data) {
  await setTimeout(() => data.response.outcome = 'success',500)
}

но это не работает, потому что setTimeout не обещание

Вы можете использовать простую функцию сна, которая разрешается через некоторое время.

async function sleep (time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

async function run (data) {
  await sleep(500);
  data.response.outcome = 'success';
}

Так же, как setTimeout, который является API обратного вызова, может быть превращен в обещание, потоки могут быть превращены в обещание. Обратите внимание, что в примерах как sleep, так и readFile я использую ключевое слово async, чтобы прояснить ситуацию

  async readFile (file) {
    return new Promise((resolve, reject) => {
      let data = '';
      fs.createReadStream(file)
        .on('data', d => data += d.toString())
        .on('error', reject)
        .on('end', () => resolve(data));
    });
  }

Для большинства функций вы можете пропустить обещание вручную и использовать util.promisify

   const { readFile } = require('fs');
   const { promisify } = require('util');

   const readFileAsync = promisify(readFile);

Ключевым моментом является то, что обещания должны разрешиться после выполнения работы, и что вы должны ждать этого, используя await или .then

Например, чтобы прояснить ситуацию, первый пример

async function run (data) {
  return sleep(500).then(() => data.response.outcome = 'success';);
}

и даже

function run (data) {
  return sleep(500).then(() => data.response.outcome = 'success';);
}

все то же самое во время выполнения

Итак, чтобы закончить

async function transform (inputFile, targetWidth, targetHeight) {
  return new Promise((resolve, reject) => {
    let transformer = sharp()
      .resize(targetWidth, targetHeight)
      .crop(sharp.strategy.entropy)
      .on('info', { width, height } => console.log(`Image created with dimensions ${height}x${width}`)
      .on('error', reject)
      .on('end', resolve);
    inputFile.pipe(transformer);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...