ex14-04-2

ソース

'use strict';
const fs = require('fs');

function grun(g) {
  const it = g();

  (function iterate(val) {
    const x = it.next(val);
    if(!x.done) {
      if(x.value instanceof Promise) {
        x.value.then(iterate).catch(err => it.throw(err));
      } else {
        setTimeout(iterate, 0, x.value);
      }
    }
   })();
}

function readFile(fileName) {
  return new Promise(
    (resolve, reject)=> {
      fs.readFile(fileName, "utf-8",
		  (err, data) => err ? reject(err) : resolve(data));
    })
}

function writeFile(fileName, data) {
  return new Promise(
    (resolve, reject)=> {
      fs.writeFile(fileName, data, err => err ? reject(err) : resolve("OK"));
    });
}

// #@@range_begin(list1)
function* fileReadAndWrite() {
  const data = yield Promise.all([readFile('a.txt'),
				  readFile('b.txt'), readFile('c.txt')]);
  yield writeFile('d.txt', data[0]+data[1]+data[2]);
}

grun(fileReadAndWrite);
// #@@range_end(list1)