2015-05-19 1 views
0

Я использую этот менеджер плагинов https://github.com/c9/architect и создаю модуль узла. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу выставить api из моего узла-узла в основное приложение. Проблема в том, что диспетчер плагинов использует обратные вызовы, чтобы сигнализировать, что все плагины зарегистрированы.Node.JS возвращает из обратного вызова

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

var api = require('apiModule') 

И в моем каталоге node_modules

module.exports = (function apiModule(){ 

    architect.createApp(config, function(err, app){ 
     if(err) throw err; 

     return app 

    }); 

})(); 

Это, очевидно, не работает, но показывает, что я Я пытаюсь вернуть значение app в основное приложение.

Как я могу получить значение app обратно в переменную api?

ответ

0

Вы не проходите обратный вызов, а создаете его. Вы тоже не должны выполнять сам.

Ваш код должен быть:

var architect = require('architect'); 
module.exports = function apiModule(config, callback){ 

    architect.createApp(config, callback); 

}); 

//otherModule 
var apiModule = require('apiModule'); 
var config = require('config'); 
apiModule(config, function(err, app){ 
    if(err) throw err; 

    // do something with app 
}); 

Если вы ищете более идиоматических апи к тому, что вы привыкли. Я предлагаю вам попробовать bluebird

var architect = require('architect'); 
var Promise = require('bluebird'); 
var createApp = Promise.promisify(architect.createApp); 
module.exports = function apiModule(config) { 
    return createApp(config); 
} 

// Then in your other module 
var apiModule = require('apiModule'); 
apiModule() 
    .then(function(result) {}) 
    .catch(function(error) {}) 

Я надеюсь, что очищает его :)

+0

Функция в первом модуле будет выполняться немедленно, когда вы требуете ('apiModule') 'и не вызывают вызов' callback', не будут определены. Вы должны удалить '()' – Pierrickouw

+0

Да, я нажал кнопку слишком рано, прежде чем я очистил код. – pixeleet

+0

Вы были довольно быстры, чтобы отказаться от ответа, но слишком ленив, чтобы предоставить решение. Великие манеры. – pixeleet

0

Вы можете пройти обратный вызов к вашему модулю:

module.exports = function(callback){ 

    architect.createApp(config, function(err, app){ 
     if(err) throw err; 

     return callback(app); //you should check if callback is a function to prevent error 

    }); 

}); 

var api = require('apiModule'); 
api(function(app) { 
    console.log(app); //you access your app 

}) 
+0

Да, я подумал об этом, но вы должны помнить, что я буду предоставлять этот модуль другим. Я не могу заставить их обернуть все свое приложение в моем обратном вызове. Мне нужно, чтобы они могли просто «требовать()» и иметь возможность использовать его. Даже если они должны были сделать второй шаг, может быть, общая переменная, которая станет доступной или что-то еще. – Rob