我可以使用promise将同步方法变成异步方法吗?
例如同步读取文件(是的,有 fs.readFile
具有回调):
// Synchronous read
var data = fs.readFileSync('input.txt');
我应该这样做吗:
function readFileAsync(){
return new Promise((resolve, reject) => {
try {
resolve(fs.readFileSync('input.txt'));
} catch(err) {
reject(err);
}
})
}
或使用异步/等待:
function async readFileAsync(){
try {
let result = await fs.readFileSync('input.txt');
return result;
} catch(err) {
return err;
}
})
}
最佳答案
TL;DR 不,为了避免阻塞,纯同步函数不可可 promise
没有。对于可 promise 的方法,它必须是异步的,即立即返回,并且在完成时使用回调。
例如:
function loop1000() {
for (let i = 0; i < 1000; ++i) {}
}
不可 promise ,因为它不会立即返回并且不使用回调。但是
function loop1000(err, callback) {
process.nextTick(() => {
for (let i = 0; i < 1000; ++i) { }
callback();
});
}
可 promise 为
function loop1000promisified() {
return new Promise((resolve, reject) => loop1000(resolve));
}
但是所有这些方法无论如何都会阻塞循环。原始版本会立即阻塞,而使用 process.nextTick() 的版本将在下一个处理器滴答处阻塞。使应用程序在循环期间无响应。
如果您想让 loop1000()
异步友好,您可以将其重写为:
function loop1000(err, callback) {
const segmentDuration = 10;
const loopEnd = 1000;
let i = 0;
function computeSegment() {
for (let segment = 0;
segment < segmentDuration && i < loopEnd;
++segment, ++i) { }
if (i == loopEnd) {
callback();
return;
}
process.nextTick(computeSegment);
}
computeSegment();
}
因此,它不会有较长的阻塞时间,而是会有几个较小的阻塞。那么 Promisified 版本 loop1000promisified()
可能会有意义。
免责声明:直接在 SO 上键入代码,无需任何测试。
关于node.js - Promise 同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324434/