2016-12-02 1 views
0

Что такое чистый способ использования bluepird promisified fs методов? readdir создаст массив файлов и папок, но если я, в свою очередь, зациклю каталоги, которые он предоставляет, я в конечном итоге напишу что-то очень похожее на парадигму вложенности обратного вызова (за исключением того, что она даже не работает). Какова стандартная практика, связывающая эти обещания таким образом, чтобы их возвращаемые значения могли быть зациклированы?Как (не) в гнездо `then` производить методы обещания?

var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs-extra')); 
var path = require('path'); 
var junk = require('junk'); 

//this does not work 
fs.readdirAsync('./node_modules') 
    .bind(this) 
    .then((modules) => { 
    this.allFiles = []; 
    modules = modules.filter((item) => junk.not && !/^\./.test(item)); 
    modules.forEach((module, index, modulesArray) => { 
     fs.readdirAsync(path.join('node_modules', module)) //ugly af and don't even get files to next `then`! 
     .then((files) => { 
      console.log(files); // yep, array of files all right 
      this.allFiles.push(files); 
     }); 
    }) 
    }) 
    .then(() => { 
    console.log('all of the files', this.allFiles) // => [] no files 
    }) 
    .catch((err) => { 
    console.error('error! error!', err); 
    }) 
+1

Вы можете использовать 'async' и' await' некоторые из обещаний. – ssube

+0

использование названных функций – zzzzBov

+0

@zzzzBov Не могли бы вы более подробно рассказать о том, как это может решить проблему? Благодаря! – 1252748

ответ

3

Вы не возвращаете обещание в вашей первой наружной then. Поэтому ваша внешняя цепочка обещаний не ждет чтения файлов.

Вы можете использовать Promise.all + map. Второе предложение от меня - не использовать this для хранения ваших значений, но передавать всю необходимую информацию через ваши цепочки обещаний. Это делает код намного короче:

fs.readdirAsync('./node_modules') 
    .then((modules) => { 
    return Promise.all(modules.filter((item) => junk.not && !/^\./.test(item)) 
     .map(module => fs.readdirAsync(path.join('node_modules', module)))); 
    }) 
    .then(allFiles => { 
    console.log('all of the files', allFiles); 
    }) 
    .catch((err) => { 
    console.error('error! error!', err); 
    }); 
+0

Является ли краткость единственной причиной, по которой вы рекомендуете не связывать это? – 1252748

+0

ну, это сокращает код. В противном случае мне понадобится следующий блок '.then()' после 'fs.readdirAsync (path.join ('node_modules', module))' –

+0

, вы имеете в виду, что вам понадобится другой для того, чтобы '.then ((files) => { this.allfiles = files}). then (() => {console.log ('все файлы, привязанные к then', this.allfiles)}); '? – 1252748

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