按顺序执行导入的Javascript函数

时间:2015-03-17 02:58:22

标签: javascript callback

我想在我从其他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;
}

3 个答案:

答案 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
  • 中传递的新参数
  • 检查以确保传入参数并且它是函数
  • 调用fnCallback函数,结果作为参数传入
  • 删除return声明

现在调用convert方法时,在长时间运行的进程完成后,将执行Callback方法。

要调用修改后的convert方法,您现在必须传入回调函数

function myCallback(path){
    // do something with the path
}

pdftoPng.convert(PdfFilePath,myCallback);