由于node.js的异步性,不会发生更改

时间:2019-03-09 12:02:52

标签: node.js

我是Node js的初学者,我正在使用pure node.js做一个简单的项目。 所以这是我的代码:

if(req.url ==="/"&&req.method==="POST"){
        let reqBody = "";
        req.on('data', chunk=>{
            reqBody += chunk.toString();
        });
        req.on("end", ()=>{
            reqBody = reqBody.split("&");
            for(let i=0; i<reqBody.length; i++){
                reqBody[i]=reqBody[i].split("=");
                reqBody[i] = reqBody[i][1];
                };
            //filter country    
            let countryFound;
            if(reqBody[1].length>0){
                    let countryList = "";
                    let countryVal = [];

                    countryListStream = fs.createReadStream("./public/country.list.json", "UTF-8");
                    countryListStream.on("data", countryChunk=>{
                        countryList+=countryChunk;
                        countryChunk = JSON.parse(countryChunk);
                        countryFound = countryChunk.filter(elem=> elem["name"].toLowerCase()==reqBody[1].toLowerCase());
                        if(countryFound.length!==0){
                            countryListStream.destroy();
                        };
                    });
                    countryListStream.on("end", ()=>{
                        countryFound = "Not Found"
                    });
            };
        });

    };

我的问题在“过滤器国家/地区”注释下方: 当我在“ countryListStream”事件之外记录“ countryFound”变量时,它显示未定义。但是当我在事件内记录它时,它显示我想要的。我认为这是因为如何制作了node.js,但是如果它是未定义的,我不知道继续我的代码。 我认为我需要包含一个代码,该代码要等到变量更新后才能运行其余代码。 我在if语句之后尝试了此操作,但并没有解决它:

if(countryFound!===undefined){
    console.log(countryFound);
}

1 个答案:

答案 0 :(得分:0)

通过查看文档,调用countryStream.destroy()会发出closeerror事件。因此,将处理程序添加到close事件中是有意义的,您可以在该事件中继续处理已分配给这些变量的值:

countryStream.on('close', () => {
    console.log(countryFound) // should not be undefined now
    // ...do something with your new values
});