【问题标题】:How can I manage asynchronous in Node js如何在 Node js 中管理异步
【发布时间】:2015-09-23 03:04:44
【问题描述】:

我现在遇到了麻烦,我不知道如何使用异步来执行此操作。 我有一个名为“jsonFileData.js”的文件,这里是:

// jsonFileData.js
var fs = require('fs'),
    Converter = require('csvtojson').Converter,
    csvConverter = new Converter();

function jsonFile(filename) {

    csvConverter.on("end_parsed",function(jsonObj)     
    return jsonObj;
    });
    fs.createReadStream('../csv_parse/' + filename + '.csv').pipe(csvConverter);                                 
}

module.exports = {
    language: jsonFile('language'),
};

另一个文件调用“main.js”

// main.js
var jsonFile = require('./jsonFileData');

console.log(jsonFile.language);

当我运行“main.js”时,它显示为“未定义”。如何制作“var jsonFile = require('./jsonFileData');”在开始打印结果“jsonFile.language”之前完全运行? 感谢您阅读我的问题。

【问题讨论】:

  • 请注意,您的 jsonFile 函数没有返回值。这就是模块未定义的原因。
  • 这种类型的问题在这里每天至少被问 10 次。我建议您对“async node.js return”进行一些搜索,然后阅读数百个答案和文章中的一些。简短的回答是,异步回调在未来某个时间被调用,而其他同步代码继续运行。因此,您可以使用异步函数结果的唯一位置是在回调中表示其完成。如果值是异步获取的,则不能将您的函数视为同步并返回该值。
  • 此外,您需要了解回调函数中的 return 语句仅从该回调返回,并且该返回值返回到异步操作的内部,而不是返回到您的任何代码.它不会从外部函数返回。
  • 是的,谢谢大家帮助我。但我找到了使用“bluebird”和“then”来治疗这个问题的方法。但它适合使用它吗?因为我尝试使用它,但它遇到了麻烦。你的想法如何?

标签: javascript node.js asynchronous synchronous


【解决方案1】:

您的异步回调不正确。与我在下面所做的更改进行比较。

// jsonFileData.js
var fs = require('fs'),
Converter = require('csvtojson').Converter,
csvConverter = new Converter();

function jsonFile(filename,callback) {

  csvConverter.on("end_parsed",function(jsonObj) {    
    return callback(null, jsonObj);
   });
  fs.createReadStream('../csv_parse/' + filename + '.csv').pipe(csvConverter);                                 
 }

module.exports = {
  language: jsonFile
};

在您的main.js 文件中:

// main.js
var jsonFile = require('./jsonFileData');

jsonFile.language('language', function(err, jsonObj){
   if(err){
     console.log(err);
     return;
   }
   console.log(jsonObj);
   console.log("Hello World!"); // Edit based on comment
});

【讨论】:

  • 感谢您的帮助。但我想在 main.js 的末尾添加行 'console.log('Hello World')'。那就是我希望它打印出结果 jsonObj 的数据,然后打印出“Hello World”。但是当我尝试测试您的代码时,它首先打印出“Hello World”,然后打印出 jsonObj 的结果。那么我该如何管理先打印出 jsonObj,然后再打印出“Hello World”。再次感谢您的帮助。
  • 查看我上面的编辑,我在console.log(jsonObj) 之后立即添加了一个控制台日志语句。文件加载后你想做的所有事情都必须进入回调函数内部,而不是外部。
猜你喜欢
  • 2017-02-03
  • 2016-02-07
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多