承诺不按“then()”的顺序排列? (的NodeJS)

时间:2016-06-16 15:27:42

标签: javascript node.js request promise response

为什么then()表示console.log('这是在写作和提取之前');声明在写入和提取到PDF之前?我是Promises的新手,所以我对此感到有些困惑。我希望then()语句在写入和解析发生之后发生。

function writeToPDF(data, fileName) {
  return new Promise((resolve, reject) => {
    data.pipe(fs.createWriteStream(fileName), err => {
      reject();
    });
    data.on('end', () => {
      resolve();
    })
  });
}
​
function extractPDF(pdf) {
  return new Promise((resolve, reject) => {
    extract(pdf, {splitPages: false}, (err, text) => {
      if (err) {
        console.log(err);
      } else {
        resolve(text);
      }
    });
  });
}
​
request(link).then((success, failure) => {
  let fileName = './name-' + Date.now() + '.pdf';
  writeToPDF(data, fileName).then(() => {
    extractPDF(fileName).then((text) => {
      arrayOfDocuments.push(text);
    })
  }, () => {
    //handle error
  });
}).then(() => {
  console.log('THIS COMES BEFORE THE WRITING AND EXTRACTING');
});

2 个答案:

答案 0 :(得分:0)

您正在嵌套then值并且实际上有两条不同的then路由 - 因为缺少更好的术语。

就javascript而言,一旦then方法中的第一个request得到解决,它就可以转到下一个then。这里,一旦writeToPdf被解析,那么承诺链的那一部分就会转移到console.log语句,因为该级别的先前承诺已经解决。这有道理吗?

答案 1 :(得分:0)

request(link).then(...)块包含一个外部承诺链和两层嵌套的promise链。

如果你用{block}returns are not explicit编写一个胖箭头函数,那么:

  • 不会返回writeToPDF()extractPDF()派生的承诺,
  • 外部承诺链未被告知存在内部承诺或其解决方案,
  • console.log('THIS COMES BEFORE ...')完全依赖于履行request(link)返回的承诺,并保证在PDF内容开始之后但在完成之前发生。
request(link).then((success, failure) => {
  let fileName = './name-' + Date.now() + '.pdf';
  return writeToPDF(data, fileName).then(() => {
//^^^^^^
    return extractPDF(fileName).then((text) => {
//  ^^^^^^
      arrayOfDocuments.push(text);
    })
  }, () => {
    //handle error
  });
}).then(() => {
  console.log('THIS COMES BEFORE THE WRITING AND EXTRACTING');
});