考虑以下以串行/顺序方式读取文件数组的代码.readFiles返回promise ,只有在按顺序读取所有文件后才会解析该promise .

var readFile = function(file) {
  ... // Returns a promise.
};

var readFiles = function(files) {
  return new Promise((resolve, reject) => {
    var readSequential = function(index) {
      if (index >= files.length) {
        resolve();
      } else {
        readFile(files[index]).then(function() {
          readSequential(index + 1);
        }).catch(reject);
      }
    };

    readSequential(0); // Start with the first file!
  });
};

上面的代码可以工作,但是我不喜欢为了让事情按顺序发生而必须进行递归.有没有一种更简单的方法可以重写这段代码,这样我就不必使用我奇怪的readSequential函数了?

最初我try 使用Promise.all,但这导致所有readFile个调用同时发生,这就是我想要的not:

var readFiles = function(files) {
  return Promise.all(files.map(function(file) {
    return readFile(file);
  }));
};

推荐答案

Update 2017:如果环境支持,我将使用异步函数:

async function readFiles(files) {
  for(const file of files) {
    await readFile(file);
  }
};

如果愿意,可以使用异步生成器(如果您的环境支持)将文件的读取推迟到需要时:

async function* readFiles(files) {
  for(const file of files) {
    yield await readFile(file);
  }
};

更新:重新考虑一下-我可能会改用for循环:

var readFiles = function(files) {
  var p = Promise.resolve(); // Q() in q

  files.forEach(file =>
      p = p.then(() => readFile(file)); 
  );
  return p;
};

或者更紧凑地使用reduce:

var readFiles = function(files) {
  return files.reduce((p, file) => {
     return p.then(() => readFile(file));
  }, Promise.resolve()); // initial
};

在其他promise库(如when和Bluebird)中,您可以使用实用方法来实现这一点.

例如,Bluebird将是:

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));

var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 });
// if the order matters, you can use Promise.each instead and omit concurrency param

readAll.then(function(allFileContents){
    // do stuff to read files.
});

尽管今天确实没有理由not使用异步等待.

Javascript相关问答推荐

在JavaScript中打开和关闭弹出窗口

如何指定1条记录1个表?

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

如何保持子画布元素的1:1宽高比?

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

. NET中Unix时间转换为日期时间的奇怪行为

docx.js:如何在客户端使用文档修补程序

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

使搜索栏更改语言

浮动Div的淡出模糊效果

在react js中使用react—router—dom中的Link组件,分配的右侧不能被 destruct ''

引用在HTMLAttributes<;HTMLDivElement>;中不可用

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

Use Location位置成员在HashRouter内为空

Reaction Redux&Quot;在派单错误中检测到状态Mutations

Jexl to LowerCase()和Replace()

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

为什么当雪碧的S在另一个函数中时,Phaser不能加载它?

如何在Highlihte.js代码区旁边添加行号?

在每次重新加载页面时更改指针光标