Создание обратных вызовов для необходимых модулей в 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.

асинхронность на 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