2013-12-23 1 views
0

Я использую библиотеку обещания 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'); 
}); 

Любая идея, почему это не работает?

ответ

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 никогда не будет называть его.

+0

Возможно, стоит отметить: это не ошибка крапивницы, а проблема с обратными вызовами, которые нелегко решить. – ForbesLindesay

+0

Спасибо, я должен был прочитать исходный код, прежде чем спрашивать, это ограничение довольно очевидно, теперь вы это сказали. –

+0

Мне понадобилось время, чтобы разобраться, когда я впервые увидел его – ForbesLindesay

Смежные вопросы