Javascript 生成映射的promise数组';我什么也不退

Javascript 生成映射的promise数组';我什么也不退,javascript,generator,promise,bluebird,Javascript,Generator,Promise,Bluebird,我正在使用promise库bluebird,其中节点0.11.9运行时带有标志——harmony 我有一个简单的工作示例: var Promise = require('bluebird'); var fs = require('fs'); var readdirAsync = Promise.promisify(fs.readdir, fs); var statAsync = Promise.promisify(fs.stat, fs); Promise.spawn(function *()

我正在使用promise库
bluebird
,其中节点
0.11.9
运行时带有标志
——harmony

我有一个简单的工作示例:

var Promise = require('bluebird');
var fs = require('fs');
var readdirAsync = Promise.promisify(fs.readdir, fs);
var statAsync = Promise.promisify(fs.stat, fs);

Promise.spawn(function *() {
  var files = yield readdirAsync('./');
  var stats = yield files.map(function(file) { return statAsync(file); });
  console.log(stats);
  console.log('done');
});
这可以正常工作并输出节点的统计信息列表。 但对于以下版本:根本没有输出:

var Promise = require('bluebird');
var fs = require('fs');
var readdirAsync = Promise.promisify(fs.readdir, fs);
var statAsync = Promise.promisify(fs.stat, fs);

Promise.spawn(function *() {
  var files = yield readdirAsync('./');
  var stats = yield files.map(statAsync);
  console.log(stats);
  console.log('done');
});

你知道为什么这样不行吗?

不幸的是,
promisify
并不完美。它不知道
fs.stat
应该有多少个参数。它会传递您给它的任何参数,以及节点样式回调

Array.prototype.map
不使用单个参数调用映射函数。相反,它为它提供了项、数组中的索引和数组的副本。因此,您的第二个示例如下所示:

var Promise = require('bluebird');
var fs = require('fs');
var readdirAsync = Promise.promisify(fs.readdir, fs);
var statAsync = Promise.promisify(fs.stat, fs);

Promise.spawn(function *() {
  var files = yield readdirAsync('./');
  var stats = yield files.map(function(file, i, a) { return statAsync(file, i, a); });
  console.log(stats);
  console.log('done');
});

如果回调直到第四个参数才出现,
fs.stat
将永远不会调用它。

可能值得注意的是:这不是blubird的错,而是回调的一个问题,不容易解决。谢谢,我应该在询问之前阅读源代码,这个限制现在很明显,你说了。当我第一次看到它的时候,我花了一段时间才弄明白