2015-02-22 2 views
5

Я новичок в обещаниях и использовании реализации rsvp.Как читать несколько файлов асинхронно с обещаниями, затем продолжить

Я хочу асинхронно читать список файлов, а затем перейти к другой задаче только тогда, когда все файлы были прочитаны.

Я дошел до основной структуры, чтобы прочитать один файл, и цепь к следующей задаче:

var loadFile = function (path) { 
    return new rsvp.Promise(function (resolve, reject) { 
     fs.readFile (path, 'utf8', function (error, data) { 
      if (error) { 
       reject(error); 
      } 
      resolve(data); 
     }); 
    }); 
}; 

loadFile('src/index.txt').then(function (data) { 
    console.log(data); 
    return nextTask(data); 
}).then(function (output) { 
    //do something with output 
}).catch(function (error) { 
    console.log(error); 
}); 

Я хочу сделать что-то вроде этого:

loadFile(['src/index.txt', 'src/extra.txt', 'src/another.txt']).then(... 

Я вы видели arrays of promises и hash of promises в документах, но я не знаю, что наиболее важно, или как их использовать. Мне нужен пример их использования в контексте моей проблемы выше, чтобы понять их.

ответ

5

Вы хотите использовать RSVP.all():

var promises = ['path1', 'path2', 'path3'].map(loadFile); 

RSVP.all(promises).then(function(files) { 
    // proceed - files is array of your files in the order specified above. 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

Вы можете сделать promises объект и использовать RSVP.hash() вместо:

var promises = { 
    file1: loadFile('path1'), 
    file2: loadFile('path2'), 
    file3: loadFile('path3') 
}; 

RSVP.hash(promises).then(function(files) { 
    // files is an object with files under corresponding keys: 
    // ('file1', 'file2', 'file3') 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

(благодаря @Benjamin Gruenbaum по предложению использовать .map())

+0

Перед загрузкой файлов у меня есть несвязанная предыдущая задача, которая возвращает другое обещание. Как бы я мог привязать RSVP.all() к ожиданию этой зависимой задачи? – mtmacdonald

+1

Просто вызовите RSVP.all() в обратном вызове решения предыдущей задачи. – bardzusny

+0

Я не мог заставить версию объекта работать: [Ошибка: в методах массива должен быть предоставлен массив]. Неважно, для чего нужен RSVP.hash. – mtmacdonald

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