【问题标题】:How to retrieve value from process.on in nodejs?如何从 nodejs 中的 process.on 检索值?
【发布时间】:2022-01-15 23:15:23
【问题描述】:

我正在使用的当前代码:

   async function MainFunction(){
        let arrOO;
        process.on('message', (jData) => {
            let sName;
            if(jData.koota){
                sName = jData.koota[0]
            }

            console.log(sName + ' hello!')
            arrOO = sName
        })
        
        console.log(arrOO + ' calling outside of .on')
   }

我正在尝试打印分配给sNamejData.koota[0],以便它可以在整个函数中使用。在这种情况下,在 process.on 之外,我想打印它。运行此代码时,在 console.log(arrOO + ' calling outside of .on') 处返回“未定义”。我如何在 process.on 之外调用 sName?

【问题讨论】:

  • process.on() 只是安装一个事件侦听器并立即返回,因此您的 console.log() 在任何事件发生之前运行。因此,您只是在将数据放入其中之前查看数据。对于想要了解这些进程消息的代码,您需要将其放入process.on() 回调中,或者将其放入您从该回调中调用的函数中。这是您知道何时收到消息的唯一方法。

标签: javascript node.js electron


【解决方案1】:

process.on() 只是安装一个事件监听器并立即返回,因此您的console.log() 在任何事件发生之前运行。 process.on() 被称为非阻塞。这意味着它会做一些初始工作,然后立即返回,实际数据会在稍后调用您的回调时到达。

因此,您的console.log() 只是在将任何数据放入其中之前尝试查看数据。请注意,大多数情况下,当您尝试从异步回调函数分配更高范围的变量时,这可能是编码错误的迹象,因为更高范围的代码不知道何时访问该数据。

对于任何想要了解这些进程消息的代码,您需要将该代码放入process.on() 回调中,或者将其放入您从该回调中调用的函数中。这是您知道传入消息何时发生以及某些数据何时可用的唯一方法。

这是一种选择:

function MainFunction(){
    process.on('message', (jData) => {
        let sName;
        if(jData.koota){
            sName = jData.koota[0];
            // call some function and pass it the new data
            newDataArrived(sName)
        }
    });        
}

// this function gets called when we have a new sName 
function newDataArrived(sName) {
   // put code here that uses the data
   console.log(sName);
}

或者,您可以将其设为基于 Promise 的接口,在您获得的下一个匹配事件中解析 Promise:

function MainFunction() {
     return new Promise(resolve => {
         function messageHandler(jData) {
             if (jData.koota) {
                  resolve(jData.koota);
                  // remove message listener so they don't pile up
                  // since a promise is a one-shot device, we can
                  // only use this promise once
                  process.off('message', messageHandler);
             }
         }
         process.on('message', messageHandler);             
     });
}

Mainfunction().then(sName => {
   // use sName here
});

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2021-09-02
    • 2023-03-26
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多