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