为什么第二个会在第一个之前返回?

时间:2017-01-21 20:33:12

标签: javascript node.js es6-promise

我试图了解ES6的承诺,并且在那里,我认为我有它,但我想不是。

所以我想创建/读取一堆文件,只有在此操作完成后,继续进行下一步操作。对我来说,这很好地适用于Promises,但是我在第一次操作完成之前为什么我的第二次操作返回时感到困惑。

我创建了一个函数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);
      }
    });
  })
};

2 个答案:

答案 0 :(得分:3)

这一行:

.then(console.log(1)) 

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

你可能想要更像前一行中的回调函数,比如:

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

答案 1 :(得分:0)

原因是您没有将console.log作为回调函数传递,而是立即执行它并将返回值(undefined)传递给then参数。

在第二个then中,您传递一个匿名函数,但您没有执行它。

像这样:

function myFunction() {
    console.log("inside myFunction()");
}

function then(fnCallback) {
    console.log("inside then()");
    fnCallback();
}


then(myFunction);
    /*  Log:
        inside then()
        inside myFunction()
    */



then(() => myFunction() );
    /*  Log:
        inside then()
        inside myFunction()
    */        



then(function() { myFunction() });
    /*  Log:
        inside then()
        inside myFunction()
    */        



/* what happens here:
    1) executes myFunction(), that returns undefined
    2) executes then() with undefined as argument
    3) try to call fnCallback (which is undefined), and trows an error
*/
then(myFunction());
    /*  Log:
        inside myFunction()
        inside then()
        Uncaught TypeError: fnCallback is not a function
    */