【问题标题】:How to 'order' your callbacks without using a blocking structure如何在不使用阻塞结构的情况下“订购”你的回调
【发布时间】:2019-08-16 23:56:36
【问题描述】:

我是 node.js 和 stackoverflow 的新手,我遇到了一些麻烦:我想读取两个文件并按特定顺序对它们进行处理。问题是我不知道哪个会先读完,所以我不知道如何确保它们以正确的顺序触发。

举个例子,假设我想读取两个文件并将它们写入响应中:

fs.readFile('./file1',(err,data) => {
    res.write(data);
})
fs.readFile('./file2',(err,data) => {
    res.write(data);
})

即使第二个文件小于第一个文件,我如何确保第一个文件将在第二个文件之前写入?

我能做到:

fs.readFile('./file1',(err,data) => {
    res.write(data);
    fs.readFile('./file2',(err,data) => {
        res.write(data);
    })
})

但它会像一个阻塞结构:在第一个结束之前无法开始读取第二个,这不是 Node.js 的重点......我说的对吗?

PS:对不起,如果问题是愚蠢的或我的英语不好

【问题讨论】:

  • 它不像阻塞结构,因为它是异步和非阻塞的。 这不是 Node.js 的重点 - 重点是提供适合您需求的实现。如果您需要连续编写文件,那么您列出的是正确的方法。如果你想并行编写它们,那么你不需要嵌套 readFile。
  • 您可以使用promise 和/或async/await。搜索这些主题,你会得到很多好的答案。 MDN 文档是一个很好的起点
  • 我认为只有 2 种方法可以用 node 来实现。要么它的串联意味着第二个仅在第一个完成后才开始,要么让它们同时发生。在这两种情况下,您都编写了所需的代码。有什么困扰你?
  • @naga-elixir-jar 谢谢这似乎是我需要的

标签: node.js callback


【解决方案1】:

Promiseasync/await 存在的原因之一(其中一个)就是为了解决这类问题。

你可以创建一个包装器来返回Promise

function readSomething(filePath) {
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, (err, data) => {
      if (err) reject(err);
      else resolve(data);
    });
}

那你就可以打电话了,

// called in parallel
const result1 = readSomething('./file1');
const result2 = readSomething('./file2');

result1.then((data) => {
  res.write(data) // or anything
  // to order, chaining promise
  return result2;
})
.then(data => res.write(data))

使用async/await,您可以这样做(await 仅在 async function 内部有效):

async function handleResults() {
  res.write(await result1)
  res.write(await result2)
}

注意:注意错误(reject 案例)。在这种情况下,他们变得有点棘手。 (我是你能猜出来的)

nodejs 中,您也可以利用EventEmitter 的力量。您还可以查看由rxjs library 实现的reactive programming Observer 模式。

【讨论】:

    【解决方案2】:
    let file1 = fs.readFile('./file1')
    let file2 = fs.readFile('./file2');
    file1 = await file1;
    file2 = await file2;
    res.write(file1)
    res.write(file2)
    

    通过这种读取是并行进行的,但是如果您事先知道 file1 会比较大,您可以交换 await 语句。然后你可以按你想要的任何顺序写。

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2017-12-29
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多