【发布时间】:2020-06-11 03:27:20
【问题描述】:
我尝试了许多变体,让我的函数返回一个参数,这样我就可以只在一个步骤完成时运行我的函数,但寻找不会让我陷入回调地狱的最佳方法。
我有以下功能
function convertPdfToImage(fileName) {
return new Promise((resolve, reject) => {
var pdfImage = new PDFImage(fileName+".pdf");
pdfImage.convertFile().then(function (imagePaths) {
var file = fs.createWriteStream(imagePaths);
file.end();
file.on("finish", () => { resolve(true); });
file.on("error", reject);
return resolve(true)
});
});
}
我在这里这样称呼:
Promise.all([convertPdfToImage('test2'), convertPdfToImage('test1')])})
.then(function () {
compareItems(codeId);
});
这是PromiseAll中调用的方法
function convertPdfToImage(env: string, shareClassId: string[]) {
return new Promise((resolve, reject) => {
var pdfImage = new PDFImage("output/" + shareClassId + env + ".pdf");
pdfImage.convertFile().then(function (imagePaths) {
var file = fs.createWriteStream(imagePaths);
file.end();
file.on("finish", () => { resolve(true); });
file.on("error", reject);
return resolve(true)
});
});
}
无论我尝试什么问题,我都无法保证 compareItems 在 convertPdfToImage 之后运行(PromiseAll 已解决)
【问题讨论】:
-
删除
return resolve(true)。否则你解决两次。 -
谢谢。试过了,但仍然没有。我只是为了确保它能够解决。事实上,如果没有第二次解决,它根本不会解决
-
您是否尝试过捕获并记录可能的错误?
-
为什么在向流中写入任何内容之前以及在流上安装任何事件处理程序之前调用
file.end()。这两个似乎都错了。当然,您应该在开始写入流之前和调用file.end()之前安装您的事件处理程序。而且,您必须删除return resolve(true),因为它只会在您的任何事件处理程序运行之前执行 - 使它们无用。
标签: javascript typescript promise es6-promise createwritestream