Установить свойство объекта после асинхронного вызова в узле

Как создать модуль nodejs, который отправляет почтовый запрос на URL-адрес и возвращает объект, свойство данных которого установлено как данные, возвращаемые из почтового запроса?

var client = require('node-rest-client').Client();

module.exports = (function(){
    var instance;

    function createInstance(){
        client.post(url,function(data){
            //set instance.data = data OR
            // return function that lets me access a private property 'data' set to data returned in this callback
        });
    }

    return {
        Cloud : function(){
            if(!instance){
                instance = createInstance();
            }

            return instance;
        }
    }
})

РЕДАКТИРОВАТЬ:

В основном, когда я вызываю вышеуказанный модуль и выполняю облачную функцию:

var cloud = require('module').Cloud(); console.log(cloud.data); // должен дать мне данные, полученные из почтового запроса. // ТАКЖЕ я хочу сделать это, используя шаблон модуля, с почтовым запросом внутри модуля.


person Deepak    schedule 04.06.2015    source источник
comment
Вы имеете в виду, что хотите получить некоторые данные через HTTP POST на определенный URL-адрес? Какие возвращаемые данные? JSON, XML и т. д.?   -  person TaoPR    schedule 04.06.2015
comment
Вы не можете напрямую вернуть результат асинхронной операции из функции вашего модуля. Вместо этого вы можете передать вызывающему объекту обратный вызов, который будет вызываться с результатом асинхронной операции, или вы можете вернуть обещание, которое будет разрешено с результатом после завершения асинхронной операции.   -  person jfriend00    schedule 04.06.2015
comment
Как уже было сказано, то, что вы хотите, невозможно. Вы должны сделать это другим способом (обратный вызов или обещание).   -  person Felix Kling    schedule 04.06.2015
comment
что, если вместо этого я отправлю объект в функцию: поэтому Cloud: function (obj), а обратный вызов устанавливает свойства объекта. Что-то не так с этим?   -  person Deepak    schedule 04.06.2015


Ответы (1)


Вы можете использовать обещание, например. :

function postReq() {
    return new Promise(function(resolve, reject) {
       client.post(url, function(data) {
           resolve(data);
       })
    });
}

postReq()
.then(function(data) {
  // Do whatever you want with the data returned from client.post
  console.log(data);  
})
person Datsik    schedule 04.06.2015