如何在不使用阻塞结构的情况下“命令”回调

问题描述 投票:-1回答:2

我是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 callback
2个回答
0
投票

其中一个原因(存在几个)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的力量。您还可以查看由reactive programmingrxjs library模式实施的Observer


-1
投票
let file1 = fs.readFile('./file1')
let file2 = fs.readFile('./file2');
file1 = await file1;
file2 = await file2;
res.write(file1)
res.write(file2)

通过此读取以并行方式进行,但如果您事先知道file1将会相对较大,则可以交换await语句。然后你可以用你想要的顺序写。

© www.soinside.com 2019 - 2024. All rights reserved.