0

У меня есть код на node.js с модулем request похожий на этот:

var request = require('request');

function name(/*параметры*/) {
    var response = '';
    var options = {
    /*
    */
    }
    function callback(err, httpResponse, body) = {
        response = //Действия с body
    }
    request(options, callback);

}

console.log(name(/*параметры*/));

Мне нужно что-бы функция name при вызове возвращала значение response. Мне не нужен console.log, это скорее было для условности.

Jhon Doe
  • 13
  • 1
  • 1
  • 3

2 Answers2

1

const request = (options, callback) => setTimeout(() => callback(null,{},'response'),1111);

// Вариант 1: Callback function name( callback, ...params) { var options = params; request(options, (err, httpResponse, body) => { let result = body.toUpperCase(); callback(null, result); }); } name((err,result) => { console.log(result); });

// Вариант 2: Promise (то же самое, только в сахаре) function name_promised(/параметры/) { return new Promise((resolve, reject) => { var response = ''; var options = {/*/} request(options, (err, httpResponse, body) => { let result = body+' promised'; resolve(result); }); }); } name_promised(/параметры*/).then(result => { console.log(result); });

// Вариант 3: async/await (еще больше сахара) (async () => { let result = await name_promised(); console.log(result); })();

Последний вариант удобно использовать с промифицированным модулем request, примерно так -

const request = require('request-promise');
(async () {  
    let body = await request(options);
    console.log(body);
})();   
Darth
  • 13,217
0

Дело в том что сделать это так как вы хотите чтоб прям функция вернула можно лишь одним способом с помощью async/await.

var request = require('request');
( async() => {
function name(/*параметры*/) {
    return new Promise((resolve, reject) => {
       var response = '';
       var options = {
       /*
       */
       }
       function callback(err, httpResponse, body) = {
           response = //Действия с body
           //// после действий с responce отравляем его в ответ
           resolve(responce);
       }
       request(options, callback);

       } 
    })

    console.log( await name(/*параметры*/));
})();

Обернул код в IIFE функцию, так как await можно использовать только внутри async