繁体   English   中英

等待 javascript 事件处理程序

[英]Await-ing a javascript event handler

我正在努力处理 javascript 中的事件处理程序,我试图通过异步/等待使事情正确响应。

下面代码中的问题与file.on事件有关——我正在努力正确地承诺它。 目前checkSomething方法在file.on处理程序完成之前返回,因此returnValue始终为false

我可以使用一些建议和最佳实践。

go 确保在返回值之前在处理程序中检查/设置returnValue的好方法是什么? 我已经尝试将await关键字放在事件处理程序的前面,并在其回调 function 中,但这没有用,我基本上在这一点上勉强可以使用一些技巧。 谢谢。

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
}

由于该事件仅用作继续处理的信号,因此您可以在继续使用内联样式代码之前承诺并await其接收。 这也意味着不需要在嵌套函数的外部 scope 中声明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`;
}

你已经接近了,你只需要返回一个 promise,它会在执行到你想要的点(你有评论的地方)后解决。

其他要记住的事情:

  • 确保只在async函数中使用await
  • 使用===而不是==
  • ;结束语句 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'))));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM