这是在Promise中包装readFileSync的正确方法吗?

时间:2016-01-24 19:44:27

标签: javascript

以下代码的原因是摆脱callback hell / pyramid of doom。我还没有完全理解i/o blocking

'use strict';

var fs = require('fs');
var co = require('co');

co(function* () {

    var fileName = 'readme.txt';

    var str =
        yield new Promise(function (resolve, reject) {
            var result;
            try {
                result = fs.readFileSync(fileName, 'utf8');
            } catch (err) {
                reject(err);
            }
            resolve(result);
        });
    console.log('result readFileSync: ' + str);

});

诚实地说,我所期待的只是yesno答案。如果没有人可以提供一些细节,我会完全希望能够正确地学习JavaScript同步/异步以及如何利用Promise的力量。

2 个答案:

答案 0 :(得分:5)

简短回答

没有

有用的答案

如果要包装文件读取操作,请尝试尽可能使用节点功能的异步版本。将readFileSync与promise相比,使用readFileSync比使用readFileSync没有优势,因为readFile会阻止该过程,直到它完成读取,'use strict'; var fs = require('fs'); var readFilePromise = function(file) { return new Promise(function(ok, notOk) { fs.readFile(file, function(err, data) { if (err) { notOk(err) } else { ok(data) } }) }) } readFilePromise('/etc/passwd').then(function(data) { // do something with the data... }) 没有。

因此,更好的解决方案是这样的:

data

答案 1 :(得分:4)

正确的方法是使用Node的 native util库并提供fs.readFile

const path = require('path');
const fs = require('fs');

const INDEX = path.join(__dirname, 'app', 'index.html');
const readFile = require('util').promisify(fs.readFile);

readFile(INDEX)
  .then(e => console.log(e.toString()))
  .catch(e => console.log('FOOBAR ' + e));

结果:

one@dolphin:~/github/resume $ node toolchain/inject.js 
FOOBAR Error: ENOENT: no such file or directory, open '/home/one/github/resume/toolchain/app/index.html'