javascript - 为什么第二个然后在第一个之前返回?

标签 javascript node.js es6-promise

我试图理解 ES6 的 promise ,有那么一瞬间,我以为我已经明白了,但我想没有。

所以我想创建/读取一堆文件,并且只有在该操作完成后,才继续执行下一个操作。对我来说,这非常适合 Promise,但我很困惑为什么我的第二个操作在第一个操作完成之前就返回了。

我创建了一个函数ensureFileExists它返回一个 promise ,我将其作为回调传递到 fileNames.map 。这会记录 true 的数组到控制台,这正是我所期望的。但我的困惑是,我以为我借调的then只有在我的第一个 then 之后才会被调用已完成。

如果有人可以详细说明为什么我的第二个 then在我的第一个then之前返回,我将不胜感激。

getFileNames(ensureFileExists) {
  for(let i = 0; i < this.fileCount; i++) {
    this.fileNames.push(this.generateRandomfileNames());
  };
  Promise.all(this.fileNames.map((file) => ensureFileExists(file)))
         .then(values => console.log(values))
         .then(console.log(1)) // Why is this logged before values???
         .catch(err => console.log(err))
};

ensureFileExists(file) {
  return new Promise((resolve, reject) => {
    let filePath = path.join(this.src, file);

    fsExtra.ensureFile(filePath, (err) => {
      if (err === 'undefined') {
        reject(new Error('Error creating file'));
      } else {
        resolve(true);
      }
    });
  })
};

最佳答案

这一行:

.then(console.log(1)) 

立即调用console.log,并将返回值传递给then方法。

您可能想要更像前一行中的回调函数的东西,如下所示:

.then(() => console.log(1))

关于javascript - 为什么第二个然后在第一个之前返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784159/

相关文章:

javascript - Discord.js var 与用户名输出 "undefined"

javascript - React-Slick 不适用于 React 中的首次渲染

node.js - 使用 nodemailer 和 mandrill smtp 开始出错。 CERT_HAS_EXPIRED 错误 : certificate has expired

javascript - 如何传递多重 promise 的错误?

javascript - 解构 promise 回调

javascript - 为什么以下代码不返回所有数组元素的总和?

javascript - Facebook 对象登录后返回未知

javascript - Python有没有办法通过函数传递参数

node.js - 找不到 Node gyp

javascript - 并行运行 Node 和 Apache