node.js - Promise 同步方法

标签 node.js asynchronous promise es6-promise

我可以使用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/

相关文章:

javascript - 使用 Promise.all 执行数组中的 promise 会破坏它们

javascript - 每次递归调用函数之间的延迟

javascript - sinon spy 不在具有异步功能的 stub 中调用

javascript - 是否可以使用 Node.js 创建 XLS excel 文件并控制单元格类型?

node.js - 如何处理 Node.js 中的循环依赖

node.js - Express 请求对象未正确报告 https

c# - .Net Core 中的异步服务器套接字 - 如何返回结果?

Java 调度执行器线程进入等待状态

c# - 使用 WPF 客户端和 Active Directory ADFS 对 Cloud NodeJS 后端进行身份验证

c# - 异步 SHA256 哈希