这是将readFileSync包装在承诺中的正确方法吗?
Is this the correct way to wrap readFileSync in a Promise
下面代码的原因是摆脱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);
});
老实说,我所期待的只是一个yes
或no
答案。完全希望如果没有,有人可以提供一些细节,因为我正在尝试正确学习JavaScript同步/异步以及如何利用Promises的力量。
简答
不
有用的答案
如果要包装文件读取操作,请尝试尽可能多地使用 Node 函数的异步版本。与单独使用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...
})
正确的方法是使用 Node 的原生 util 库和 promisfy 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'
相关文章:
- 打破承诺链的好方法是什么
- 将同步函数包装到承诺中的最佳方法是什么?
- “未捕获(在承诺中)”在获取“then”方法中调用拒绝函数时
- 如何实现这种方法与承诺
- 有没有一个好的方法来缩短Javascript的承诺
- 这是使用承诺与 Sequelize.js的正确方法吗?
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 是否可以覆盖本机 Es6 承诺解析方法
- 在nodejs中使用Q.js承诺进行循环的正确方法
- 将承诺处理程序绑定到其类的更好方法
- 使用取消方法增强ES6承诺
- 承诺取消方法.为什么它还没有实现,而不是其他承诺框架
- 猫鼬静态方法返回蓝鸟承诺
- 如何承诺一个节点.js插件方法
- 问.js节点承诺.“套接字”上缺少错误处理程序.类型错误:无法调用未定义的方法“then”
- 有没有一种 AngularJS 方法来使用带有承诺返回的浏览器模式
- 如何在返回承诺的服务中创建 reset() 方法
- 使用承诺作为数据依赖项的正确方法
- 使用承诺编写可读代码的最佳方法是什么?
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用