产生一个映射的promise数组不返回任何东西

时间:2013-12-23 06:11:45

标签: javascript generator promise bluebird

我正在使用带有节点bluebird的promise库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');
});

知道为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

遗憾的是,问题Promise.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将永远不会调用它。