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

时间:2019-03-26 14:41:35

标签: node.js callback

我是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:很抱歉,问题是愚蠢的还是我的英语不好?

2 个答案:

答案 0 :(得分: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/awaitawait仅在async function内部有效):

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

注意:当心错误(reject种情况)。在这种情况下,它们变得有些棘手。 (我可以解决)

nodejs中,您也可以利用EventEmitter的功能。您还可以检出rxjs libraryreactive programming模式实现的Observer

答案 1 :(得分:-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语句。然后,您可以按任意顺序写。