javascript - Node.js:在调用resolve()之前解决了Promise?

标签 javascript node.js promise

我对 Node.js 及其异步行为非常陌生。

我正在尝试获取一个文件,保存它的副本,在复制的文件中附加一行,然后开始使用复制的文件 - 按此顺序。

这大概就是我现在所拥有的......

var first = new Promise(function(resolve, reject) {
    console.log("1");
    var readStream = fs.createReadStream("file.txt");
    var writeStream = fs.createWriteStream("file-copy.txt");
    readStream.on("end", function () {
        writeStream.end();
    });

    var pipeAction = readStream.pipe(writeStream);
    pipeAction.on("close", function() {
        console.log("2");
        resolve();
    });
});

var second = new Promise(function(resolve, reject) {
    console.log("3");
    fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT",  function (err) {

    });
    console.log("4");
    resolve();
});

var third = new Promise(function(resolve, reject) {
    // do something with the modified, copied file
    console.log("5");
});

first.then(second).then(third);

输出显示 1 3 4 5 2 而不是 1 2 3 4 5。任何人都可以分享一些关于为什么“first”能够在打印“2”之前解析的信息吗?

谢谢!

最佳答案

您正在使用promises错误地。在你的例子中,你立即调用你的 promise 。由于它们的执行器函数(带有 resolve/reject 参数的回调)在实例化 Promise 时被调用,因此您将立即记录 1、3、4 和 5。由于 console.log('2') 包含在异步操作的回调中,因此它被推迟并最终被最后调用。

实现您尝试的正确方法是将变量设置为函数本身并返回您的 promise 。这样,当调用 firstsecondthird 函数时,它们会立即调用其执行器并启动控制流。不过,您必须返回 promise ,否则您将破坏 promise 链。

function first() {
  return new Promise(function(resolve, reject) {
    console.log("1");
    var readStream = fs.createReadStream("file.txt");
    var writeStream = fs.createWriteStream("file-copy.txt");
    readStream.on("end", function() {
      writeStream.end();
    });

    var pipeAction = readStream.pipe(writeStream);
    pipeAction.on("close", function() {
      console.log("2");
      resolve();
    });
  });
}

function second() {
  return new Promise(function(resolve, reject) {
    console.log("3");
    fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT", function(err) {

    });
    console.log("4");
    resolve();
  });
}

function third() {
  return new Promise(function(resolve, reject) {
    // do something with the modified, copied file
    console.log("5");
  });
}

first().then(second).then(third);

产量:

1
2
3
4
5

这是一个可以使用的工作版本:

function first() {
  return new Promise((resolve, reject) => {
    console.log(1);
    // async request
    setTimeout(() => {
      console.log(2);
      resolve();
    }, 1000);
  });
}

function second() {
  return new Promise((resolve, reject) => {
    console.log(3);
    // async request
    setTimeout(() => {
      console.log(4);
      resolve();
    }, 1000);
  });
}

function third() {
  return new Promise((resolve, reject) => {
    console.log(5);

    resolve();
  });
}

first()
  .then(second)
  .then(third);

关于javascript - Node.js:在调用resolve()之前解决了Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277209/

相关文章:

javascript - 显示/隐藏 div 的问题 - 单击外部 div 来隐藏它时,您需要单击两次才能再次显示它

javascript - 如何获取带有授权 token 的 Google 用户 openid?

javascript - 找不到模块 'coffee-script'

javascript - 与两个单独文件中的本地策略 Passport 发生冲突

javascript - Node.js 的故障 promise 复制值

node.js - 创建一个空的 promise

javascript - Jquery .on 事件未在 Chrome 中触发

javascript - 正则表达式? : performance

javascript - 在JavaScript中访问JS引擎日期常量的方法?

javascript - 在 catch block 中抛出新错误不起作用