首页 > 解决方案 > 从 Node.js 中的函数中获取价值

问题描述

我不知道我的问题的正确标题。我只需要一个函数的值,就像 return 但我认为它不一样。我有来自adonisjs框架中控制器的代码片段:

var nmeadata = "";
jsondata.forEach(element => {
    var x = element.nmea
    var buff = new Buffer(x, 'base64')
    zlib.unzip(buff, (err, res) => {
        if(err)
        {
            //
        }
        else
        {
            nmeadata += "greed island"
            nmeadata += res.toString()
        }
    })
});

return view.render('admin.index', {
    data: datanmea.toJSON(),
    nmea: nmeadata
})

我需要nmeadata从 zlib 函数插入的解压缩字符串数据的结果,然后将其发送到视图。但是,这一次,即使我无法像greed island我的视图那样显示简单的输出。

谢谢你。

更新

使用承诺后仍然无法正常工作:

class NmeaController {

    async index({view})
    {
        
        const datanmea = await NmeaModel.all()
        const jsondata = datanmea.toJSON()

        var promises = [];
        var nmeadata = "";
        jsondata.forEach(element => {
            promises.push(
                new Promise(resolve => {
                    let x = element.nmea
                    let buff = new Buffer(x, 'base64')
                    zlib.unzip(buff,
                        (err, res) => {
                            if (err) {
                            //
                            } else {
                            nmeadata += "test add text"
                            // nmeadata += res.toString()
                            }
                            //im also try using resolve() and resolve("any text")
                            resolve(nmeadata);
                        })
                    }
                )
            )
        });
        await Promise.all(promises);
        return view.render('admin.index', {
            data: datanmea.toJSON(),
            nmea: nmeadata
        });
    }

2019 年 8 月 22 日更新

我已经尝试过 maksbd19 的解决方案,但仍然无法正常工作

class NmeaController {

    async index({view})
    {
        
        const datanmea = await NmeaModel.all()
        const jsondata = datanmea.toJSON()

        var promises = [];
        var nmeadata = "";
        jsondata.forEach(element => {
            promises.push(
                new Promise(resolve => {
                    let x = element.nmea
                    let buff = new Buffer(x, 'base64')
                    zlib.unzip(buff,
                        (err, res) => {
                            if (err) {
                                // since you are interested in the text only, so no need to reject here
                                return resolve("");
                            }
                            return resolve("greed island")
                        })
                    }
                )
            )
        });
        const result = await Promise.all(promises); // this will be an array of results of each promises respectively.
        nmeadata = result.join(""); // process the array of result 
        return view.render('admin.index', {
            data: datanmea.toJSON(),
            nmea: nmeadata
        });
    }
}

标签: node.jszlib

解决方案


我建议两件事-

  1. 修改zlib.unzip回调函数以正确解析;
(err, res) => {
    if (err) {
        // since you are interested in the text only, so no need to reject here
        return resolve("");
    }
    return resolve(res.toString())
}
  1. 从结果中检索最终数据Promise.all
const result = await Promise.all(promises); // this will be an array of results of each promises respectively.
nmeadata = result.join(""); // process the array of result 

在这种方法中,每个承诺都会解决,最后你会得到数组中的预期结果。


推荐阅读