2015-10-15 5 views
4

У меня возникла ситуация, когда я создаю модуль узла, который возвращается только после завершения асинхронной операции. Один из способов сделать это (показано ниже) - назначить module.exports функцию с параметром обратного вызова. Внутри функции вы затем вернете обратный вызов.понимание module.exports с обратным вызовом

Вот пример того, что я описываю, с сделали будучи обратным вызовом:

// module called test.js 
module.exports = function(done) { 
    // do something asynchronous here 
    process.nextTick(function() { 
    done(); // call done when the asynchronous thing is complete... 
    } 
} 

Где я получаю повесил трубку, в том, как обратный вызов делается действительно выполняются, учитывая, что я не определяю его в любом месте ...

Например, в javascript vanilla я могу передать завершенное значение в качестве параметра, а затем вызвать его внутри функции, пока я создаю функцию обратного вызова в вызове.

function testAsyncCb(msg, done) { 
    console.log(msg); 
    setTimeout(function() { 
    done(); 
    }, 1000); 
    console.log("last line in code"); 
} 

testAsyncCb("testing", function(){ console.log("done"); }); // invocation with callback function 

Назад в первом примере узла, где вызов module.exports по требует() создает функцию для проделанного() для разрешения на право? Если нет, как разрешается обратный вызов?

Нелегко найти информацию о том, как это работает. Любую помощь/направление оценивают.

ответ

6

Подумайте о module.exports как объект (module.exports = {}). Так что все, что вы положили на объект, будет общедоступным для всех, кому требуется модуль.

Например, у вас есть

module.exports = function myFunc() {} 

затем требуют, чтобы это означало бы

var abc = require('./my-module'); --> abc == myFunc 

, если бы вы сделали

module.export.myFunc = function() {} 

, чем потребовалось бы быть

var abc = require('./my-module'); --> abc == {myFunc: function() {}} 

требуется операция sync, а не async, как в requirejs (что означает не AMD, а больше похожее на commonjs).

см http://www.sitepoint.com/understanding-module-exports-exports-node-js/ для получения дополнительной информации также для nodejs официальных документов: https://nodejs.org/api/modules.html

+0

Я обновил этот вопрос, чтобы быть более ясными. Используя ваш пример, я все еще не уверен, где определяется обратный вызов get при использовании. Итак, если abc = {myFunc: function (done) {done(); }}, где это делается? – shai

+0

, вам потребуется и вернуть функцию. чем вы можете назвать эту функцию. ваша функция, которую я вижу, получает обратный вызов, поэтому просто вызывайте ее с помощью cb как arg, но все же сам экспорт является синхронизацией, а функция определена и возвращает синхронизацию. как вы вызываете функцию после ее получения, зависит от вас. проверьте ссылки в моем исходном сообщении. – sagie

+0

получил это - ключ обрабатывает функцию require() как объект, как вы упомянули. после синтаксического анализа некоторого кода я понял, что модуль вызывается с обратным вызовом в качестве аргумента, который вы предлагаете в своем комментарии, например, require ('./ some-module) (function() {}); – shai

Смежные вопросы