【问题标题】:Promises not going in order of the "then()"s? (nodejs)承诺不按“then()”的顺序进行? (节点)
【发布时间】:2016-10-18 05:17:30
【问题描述】:

为什么 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');
});

【问题讨论】:

    标签: javascript node.js request promise response


    【解决方案1】:

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

    如果您使用{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');
    });
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我怎样才能让它做我想做的事呢?我想 writeToPDF 和 extractPDF 然后转到 console.log() 语句。
      • writeToPdf(data, fileName).then(extractPdf).then( // fn for console.log )
      • 如果我有一个请求数组怎么办?例如,我有一个包含两个请求的数组,其中一个是普通的 txt 文件,所以我不会解析它。我想在它们都完成后运行 console.log() 语句。我该怎么做?
      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 2020-06-16
      • 2019-06-16
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多