我想在我从其他2个.js文件导入的特定中执行2个函数。需要先完成的功能需要花费一些时间,第二个需要先完成,然后我需要第一个创建的文件才能工作。这基本上就是我的.js的样子:
var pdfToPng = require("./pdfToPng.js");
var doStuffToPng = require("./doStufftoPng.js");
var pdfFilePath = process.argv[2];
var pngFilePath = pdftoPng.convert(PdfFilePath);//convert takes a path
//and makes a png and returns path
//to the png
doStuffToPng.doStuff(pngFilePath);
//I want "doStuff()" to start AFTER "convert()" is done.
我很确定它与回调有关,但我是一个javascript noob并需要帮助。我可以使用setTimeout(),但这似乎是一个"管道磁带修复"对我来说。有更优雅的方式吗?
编辑:一些很棒的人想帮忙,并要求发布这个,pdfToPng.js:
var spindrift= require('spindrift');//this is a node module
var fs = require('fs');
//Makes a png from pdf in pngFolder and returns the path to that png
exports.convert = function(path)
{
var pdf = spindrift(path);
var pathToPng = path.substring(0, path.length-4); //takes off the .pdf
pathToPng += "_out.png";
//this is spindrift's stuff, makes a png in dir pngFolder/pathToPng
pdf.pngStream(500).pipe(fs.createWriteStream("pngFolder/" + pathToPng));
return "pngFolder/" + pathToPng;
}
答案 0 :(得分:1)
欢迎来到javascript的异步世界。同步创建的函数回调是异步执行的。因此,只有在确定转换函数已执行后,才必须修改代码才能执行doStuff。您可以在@ Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
中找到完成此操作的方法答案 1 :(得分:0)
如果是这样,你需要实现自己的回调, - 打开pdftoPNG.js - 使用一个参数修改转换函数
function convert(PdfFilePath, finishConvert) {
//now just insert this line where you finally instead of return
//remove return yourpngpath; //or something, i assume
//add following in the place of return
finishConvert(yourpngpath);
}
然后请像这样打电话
var pdfToPng = require("./pdfToPng.js");
var doStuffToPng = require("./doStufftoPng.js");
var pdfFilePath = process.argv[2];
pdftoPng.convert(PdfFilePath,function(path){
if(path!="") {
doStuffToPng.doStuff(path);
}
});
答案 2 :(得分:0)
您必须更新convert
方法以支持回调/承诺。
以下是使用Callbacks
的示例exports.convert = function(path, fnCallback)
{
var pdf = spindrift(path);
var pathToPng = path.substring(0, path.length-4); //takes off the .pdf
pathToPng += "_out.png";
//this is spindrift's stuff, makes a png in dir pngFolder/pathToPng
pdf.pngStream(500).pipe(fs.createWriteStream("pngFolder/" + pathToPng));
if (fnCallback && typeof(fnCallback) === "function") {
fnCallback("pngFolder/" + pathToPng);
}
}
您将看到以下内容
fnCallback
return
声明现在调用convert
方法时,在长时间运行的进程完成后,将执行Callback方法。
要调用修改后的convert
方法,您现在必须传入回调函数
function myCallback(path){
// do something with the path
}
pdftoPng.convert(PdfFilePath,myCallback);