【问题标题】:Await-ing a javascript event handler等待一个 javascript 事件处理程序
【发布时间】:2019-11-06 22:34:08
【问题描述】:

我正在努力使用 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
}

【问题讨论】:

    标签: javascript async-await


    【解决方案1】:

    由于该事件仅用作继续处理的信号,因此您可以在继续使用内联样式代码之前承诺并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`;
    }
    

    【讨论】:

      【解决方案2】:

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

      其他注意事项:

      • 确保仅在 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'))));
      }
      
      

      【讨论】:

      • 这是为了我自己的启迪,我注意到他/她也在他们的 async 函数之外使用 await 。是否应该删除 isItChecked 变量的 checkSomething() 前面使用的等待?
      • 取决于省略的代码。也许该行实际上在async 函数内。否则,是的,使用 await 是非法的,isItChecked 可以直接存储返回承诺。
      • @JonasWilms 是的,但结果在事件处理程序的回调中。 file.on() 不返回承诺。
      • @junvar 好点。我假设这是一个在更大的异步函数中返回的独立函数。感谢您的反馈。
      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多