0

I am using the promise library bluebird with node 0.11.9 running with the flag --harmony

I have a simple working example:

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');
});

This works fine and output the list of nodes' stats. But with the following version: there is no output at all:

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');
});

Any idea of why this doesn't work ?

4

1 回答 1

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则永远不会调用它。

于 2013-12-23T09:43:50.097 回答