2017-08-07 13 views
0

小さなNodeプロジェクトでRamdaを初めて使用するように推し進めており、苦労しました。 Ramdaで以下のコードを書くにはどうすればよいですか? fs-extra多くのファイルからJSONデータを収集するためにRamdaを使用してください

const dataObject = {}; 
const promises = []; 

for (let i = 0; i < myTableNames.length; i++) { 
    const tableName = myTableNames[i]; 
    const newPromise = new Promise((resolve, reject) => { 
     fs.readFile(`./tables/${filename}.json`, (err, content) => { 
      if (err) { 
       return reject(); 
      } 
      dataObject[tableName] = JSON.parse(content); 
      return resolve(); 
     }); 
    }); 
    promises.push(newPromise); 
} 

Promise.all(promises).then(() => { 
    console.log(dataObject); 
}); 
+0

'https:// www.npmjs.com/package/fs-extra'オプションを使用していますか?もしそうなら、 'fs'メソッドが約束を返すので、より簡単になります。 – adrice727

答えて

1

あなたはノードV.8を使用している場合は、このようにそれを行うことができます。 Demo

// promisify fs.readFile 
const readFile = require('util').promisify(fs.readFile) 
const getFilePath = tableName => `./tables/${tableName}.json` 
const loadFileContents = pipe(getFilePath, pipeP(readFile, JSON.parse)) 

// 1. Map each table name into promise that resolves with 
// parsed file content 
// 2. Wait for all 
// 3. Build object using table names as keys and contents as 
// as values 
Promise.all(map(loadFileContents, myTableNames)) 
    .then(zipObj(myTableNames)) 
    .then(console.log) 
+0

2つの良い解決法 - 私はzipObjについて学んだので、これを選択しました。ありがとう。 – ed94133

1

const fs = require('fs-extra'); 

const readFile = fileName => fs.readFile(`./tables/${fileName}.json`); 
const buildResults = (files) => { 
    const build = (acc, json, idx) => R.assoc(myTableNames[idx], JSON.parse(json), acc); 
    return R.reduce(build, {}, files); 
} 

Promise.all(R.map(readFile, myTableNames)) 
    .then(buildResults) 
    .then(data => console.log(data)); 
+0

ここで '解決'と '拒否 'とは何ですか? –

+0

@ScottSauyetこれは、約束を返す関数にラップされると仮定します。 – adrice727

+0

@ScottSauyet回答が更新されました。 – adrice727

関連する問題