2015-03-17 2 views
0

Я хочу выполнить 2 функции в том, что я импортировал из 2 других .js-файлов, которые я создал. Функция, которая должна быть выполнена, сначала занимает немного времени, а вторая начинается до того, как первый закончен, и мне нужны файлы, которые были созданы для работы. Вот в основном то, что мои .js выглядит следующим образом:Выполнение импортированных функций Javascript в порядке

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. 

Im уверен, что это что-то делать с обратными вызовами, но я Javascript нуб и нуждаются в помощи. Я могу заставить его работать с setTimeout(), но для меня это похоже на «исправление скотча». Какой-то более элегантный?

Edit: некоторые замечательные люди хотели помочь и попросили опубликовать это, 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; 
} 
+1

Это общее заблуждение асинхронной. Вы не можете этого сделать. Ну, ты можешь, но не так. Если вы хотите, чтобы одна вещь произошла после другой вещи, вам придется использовать вложенные обратные вызовы или обещания. – elclanrs

+0

Вам нужно переписать метод 'pdftoPng.convert' для поддержки обратных вызовов/обещаний. Можете ли вы отправить код? – jasonscript

+0

K Я добавил pdfToPng.js –

ответ

1

Добро пожаловать в асинхронном мире JavaScript. Функция обратного вызова, созданная синхронно, выполняется асинхронно. Поэтому вам нужно изменить код, чтобы make doStuff выполнялся только после того, как вы точно знаете, что функция преобразования выполнена. Вы можете найти, как это можно сделать @Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

0

если да, то вам нужно реализовать свой собственный обратный вызов, - Open 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); 
    } 
}); 
+0

https://github.com/thnew/Pdf2Png, я думаю, что OP использует это –

+1

Я не использую github.com/thnew/Pdf2Png. Я использую свои собственные файлы. Внутри pdfToPng.js я использую модуль узла «spindrift», но im также делает другие вещи. И я хотел бы сохранить эти 2 импортированных файла независимыми. Если я использую обратный вызов, это не значит, что один из них зависит от другого? –

+0

Я думаю, что решение - это обратный вызов, можете ли вы проверить последнюю модификацию и реализовать свой код? –

0

Вы должны обновить свой метод convert для поддержки обратных вызовов/обещаний.

Вот пример использования обратных вызовов

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
  • A Проверьте, чтобы убедиться, что параметр передается в и что это функция
  • Функция fnCallback вызывается с результатами, переданными в качестве параметра
  • Удаления return заявления

Теперь, когда метод convert вызывается после завершения давно запущенный процесс, метод обратного вызова будут выполнены.

Для вызова модифицированного метода convert теперь вы должны пройти в функции обратного вызова

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

pdftoPng.convert(PdfFilePath,myCallback); 
Смежные вопросы