node.js - 使用nodejs从异步函数返回列表

标签 node.js

我有以下代码:

var fs = require("fs");

function getMediaList(){
    var media_copy_list, line_list;
    media_copy_list = [];

    fs.readFile("input.csv", function(err, data) {

      line_list = data.toString('utf-8').trim().split('\n');
      return line_list.forEach(function(file_line) {
        var output_path, source_path, split_list;
        if (file_line.length) {
          split_list = file_line.split(';');
          console.log(split_list[0]);
          if (split_list.length >= 2) {
            source_path = split_list[0].toString('utf-8').trim();
            output_path = split_list[1].toString('utf-8').trim();
            media_copy_list.push({
              source: source_path,
              destination: output_path
            });
          }
        }
      });
    });
}

您可以看到我正在填写一个列表:

media_copy_list.push({
  source: source_path,
  destination: output_path
});

我想要做的是在阅读完 input.csv 文件后返回此列表。

如果我同步读取文件,我不会遇到任何问题(只需调用return media_copy_list)。但在这种情况下,我不知道。

我听说过async.parallel,但真的不知道如何应用。

input.csv 示例:

FirstPart;SecondPart

Test/test2;Whatever/example

最佳答案

只需将代码包装在 Promise 中,并在完成后才解决它。有些人建议回调,它的作用几乎相同,但现在不鼓励这种模式。你真的应该使用 promise 。

var fs = require("fs");

function getMediaList(file){
  return new Promise(function (resolve, reject) {
    fs.readFile(file, 'utf-8', function(err, data) {
      if (err) {
        return reject(err);
      }

      resolve(data.split('\n').reduce(function(media_copy_list, file_line) {
        var output_path;
        var source_path;
        var split_list;

        file_line = file_line.trim();

        if (file_line.length) {
          split_list = file_line.split(';');
          console.log(split_list[0]);

          if (split_list.length >= 2) {
            source_path = split_list[0].toString('utf-8').trim();
            output_path = split_list[1].toString('utf-8').trim();
            media_copy_list.push({
              source: source_path,
              destination: output_path
            });
          }
        }

        return media_copy_list;
      }, []));
    });
  });
}

然后,调用

getMediaList('input.csv').then(function (mediaList) {
  // ...
}).catch(function (err) {
  console.error(err.stack);
});

注意:从 Node 4.2+ 开始,bluebird、Q 等就完全没有必要了。除非您使用的是早期版本的 Node,否则请尽量避免使用它们。国际海事组织。

鼓励使用 Promise 的原因是 Node 将实现 async/await,这将允许您调用完全相同的函数,例如:

var mediaList = await getMediaList('input.csv');

关于node.js - 使用nodejs从异步函数返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397631/

相关文章:

android - React Native 和 Node 服务器 - 设备上的 Node 服务器

angularjs - 错误 : AotPlugin was detected but it was an instance of the wrong class

javascript - 使用 Promise 代替事件回调

php - 如何使用 Node 创建 pem 文件

node.js - ArangoDB 如何在 Node/Express 应用程序中使用 @arangodb 命名空间中的方法?

javascript - 未找到 Firebase Admin SDK 函数

node.js - 强制 share.js 使用相同的快速 session 数据

javascript - 数据在函数中使用之前更改

node.js - webdriver-manager 更新抛出错误 : connect ETIMEDOUT

node.js - 从 API.ai 履行请求获取代理信息