Създаване на обратни извиквания за необходимите модули в node.js

Има ли някаква възможност за създаване на някакъв вид обратно извикване в рамките на модул, създаден от мен?

Проблемът ми е, че съм написал модул за моето приложение. В рамките на този модул е ​​изпълнена някаква задача и сега основното ми приложение трябва да получи обратна връзка, че модулът е завършил задачата си.

Следното описва какво искам, но няма да работи, разбира се...

//module mymod.js
function start()
{
    var done = false;

    //do some tasks
    done = true;
}
exports.done = done;

Основно приложение

var mymod = require("./mymod.js");

while(!mymod.done)
{
    //do some tasks
}

Много ще се радвам ако някой може да ми помогне.

PS: Изпробвах дъщерни процеси (форк) за тази ситуация, но тъй като изглежда, че копира целия процес, вече нямам достъп до отворени OpenCV видео заснети... :( Като използвам модули, не се натъквам на този проблем, но вместо това получавам това един за него ^^


person Fidel90    schedule 22.08.2013    source източник


Отговори (2)


Да, можете да имате обратно повикване от вашия модул.

Това е толкова просто, колкото

function funcWithCallback(args, callback){
    //do stuff

    callback();
}

Въпреки че не знам какво се опитвате да постигнете, цикълът while изглежда подозрителен. Вероятно трябва да инвестирате в асинхронния пакет от npm.

async в github

РЕДАКТИРАНЕ: Изпитах нужда да изясня нещо. Докато горната функция всъщност възнамерява обратното извикване да се използва вместо върнатата стойност, тя не е точно асинхронна.

Истинският асинхронен подход е да направите нещо подобно:

function funcWithCallback(args, callback){      
    process.nextTick(function() {
        //do stuff
        callback();
    });     
}

Това позволява на извиканата функция да излезе и отлага изпълнението на логиката на тази функция до следващия тик.

person Josh C.    schedule 22.08.2013
comment
Уау благодаря. Не можех да си представя, че е толкова лесно :D Между другото: Има ли начин за динамично записване на променливи, които се използват в модула? - person Fidel90; 22.08.2013
comment
@Fidel90 Не съм сигурен какво имаш предвид. Освен това чувствам, че трябва да изясня нещо относно асинхронните обратни извиквания във възел, така че актуализирам отговора си. - person Josh C.; 22.08.2013
comment
@Fidel90 езикът е динамичен, така че можете да изберете да предавате и връщате каквото искате. - person Josh C.; 22.08.2013

Синтаксисът за обратно извикване:

function start(callback)
{


    //do some tasks

    callback(data);
}

exports.start = start;

Навсякъде, където имате нужда от вашия модул:

var mymod = require("./mymod.js");

mymod.start(function(data) {
   //do some tasks , process data

});
person Or Ron    schedule 22.08.2013
comment
Това беше най-лесният за мен отговор от всички отговори. Реших проблема ми, благодаря! - person CodeManiak; 10.06.2015