0

フラグで実行されている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');
});

なぜこれがうまくいかないのですか?

4

1 に答える 1

1

問題は、残念ながらそれPromise.promisifyが完璧ではないことです。いくつの引数が必要かわかりfs.statません。ノードスタイルのコールバックだけでなく、与えられた引数をすべて通過します。

Array.prototype.map単一の引数でマッピング関数を呼び出しません。代わりに、アイテム、配列内のインデックス、および配列のコピーを提供します。したがって、2 番目の例は次のようになります。

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

コールバックが 4 番目の引数まで表示されない場合、fs.stat決して呼び出されません。

于 2013-12-23T09:43:50.097 に答える