我正在使用带有节点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');
});
知道为什么这不起作用?
答案 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
将永远不会调用它。