Ожидание обработчика событий javascript - PullRequest
0 голосов
/ 07 ноября 2019

Я борюсь с обработчиком событий в javascript, я пытаюсь заставить вещи реагировать правильно с помощью async / await.

Проблема в приведенном ниже коде связана с событием file.on - я изо всех сил пытаюсь правильно его обещать. В настоящее время метод checkSomething возвращается до завершения обработчика file.on, поэтому returnValue всегда false.

Я мог бы воспользоваться некоторыми советами и рекомендациями.

Какой хороший способ убедиться, что returnValue проверен / установлен в обработчике до возврата значения? Я попытался поместить ключевое слово await перед обработчиком событий и в его функцию обратного вызова, но это не сработало, и я в основном потрудился на этом и мог бы воспользоваться некоторыми советами. Спасибо.

const axios = require('axios')
const fs = require('fs')

/*....*/

let isItChecked = await checkSomething()

async function checkSomething() {
    let returnValue = false
    const response = await axios.get('https://someUrl.com', {
        responseType: 'stream'
    })

    const file = fs.createWriteStream('./localFile.txt')

    response.data.pipe(file)

    file.on('finish' () => {
        performATask().then((result) => {
            if (result == 'good') {
                returnValue = true  //need to make sure this is evaluated before returning
            }
        })
    })

    return returnValue
}

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

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

async function checkSomething() {
    const response = await axios.get('https://someUrl.com', {
        responseType: 'stream'
    });

    const file = fs.createWriteStream('./localFile.txt');
    response.data.pipe(file);
    await new Promise( resolve=> file.on(`finish`, resolve)); // wait here

    const result = await  performATask();
    return result == 'good`;
}
1 голос
/ 07 ноября 2019

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

Другие вещи, которые следует иметь в виду:

  • Убедитесь, что вы используете await только из async функций
  • Используйте === вместо ==
  • Завершите операторы с ; s
const axios = require('axios');
const fs = require('fs');

/*....*/

let isItChecked = await checkSomething();

async function checkSomething() {
  const response = await axios.get('https://someUrl.com', {responseType: 'stream'});

  const file = fs.createWriteStream('./localFile.txt');

  response.data.pipe(file);

  return new Promise(resolve =>
      file.on('finish', () =>
          performATask().then(result => resolve(result === 'good'))));
}

...