Как вернуть значение функции [дубликат]

266
22 июня 2017, 07:14

На данный вопрос уже ответили:

  • Как вернуть значение из события или из функции обратного вызова? 3 ответа

У меня есть код на 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, это скорее было для условности.

Answer 1

Дело в том что сделать это так как вы хотите чтоб прям функция вернула можно лишь одним способом с помощью 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

Answer 2

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);
})();   
READ ALSO
Расход памяти объектами JavaScript

Расход памяти объектами JavaScript

Есть след код, меня интересует, происходит ли в этом случае экономия памяти?

230
Disallowed_useragent when google+ auth

Disallowed_useragent when google+ auth

I use Google+ Login in my Wep App (Google Sign In)In browser like Chrome or Safari working fine (opens popup in new tab with chose account (enter login, passwd), then popup closed and auth successfull

432