JavaScript return из callback

246
16 марта 2018, 15:40

Вопрос Как сделать return из callback-а?

например, есть функция

getParams(["ArrayOfParamNames"], function(CallbackResult){
    //code
});

Мне нужно достать этот CallbackResult

типа

    function getResult(){
        getParams(["Param1","Param2"], function(res){
            //Код в колбэке
        });
        return res; // ретёрним тот самый res, который объявляли в getParams(["Param1","Param2"], function(res)...);
    }
var x = getResult()
Answer 1

Как вариант предлагаю использовать объект Promise, который используется для отложенных и асинхронных вычислений:

function getResult(arrOfParamNames) {
  return new Promise((resolve, reject) => {
    return getParams(arrOfParamNames, function(CallbackResult){
      //code
      //при благоприятных условиях выполнения функции вызываем resolve
      resolve(CallbackResult)
      //иначе reject
      //отсюда выполнение попадет в catch
    });
  });
}

getResult(["Param1","Param2"])
  .then(res => {
    //при успешном выполнении
    //что то делаем с res
  })
  .catch(err => {
    //при неуспешном выполнении
    //что то делаем с err
  })

Подробнее почитайте тут и тут.

Answer 2

у меня вот так работает:

function getGeoName(message) {
        request({
            url: url,
            json: true
        }, function (error, response, body) {
            if (!error && response.statusCode === 200) {
                if (body.geonames && body.geonames.length > 0) {
                    return weather("CityName");
                }else return message.addText('Я не знаю такого города, попробуйте написать город по английски').send();
            } else return message.addText('Я не знаю такого города, попробуйте написать город по английски').send();
        })
    };
function weather(city2) {
}

У вас должно работать так:

function getResult(){
    getParams(["Param1","Param2"], function(res){
       return result(res);
    });
}
function result(){
}

Другой вариант:

var global;
setTimeout(function () {
    function getResult() {
        getParams(["Param1", "Param2"], function (res) {
            global = res;
        });
    }
}, 8000);

Async await пример:

function serialAsyncMap(collection, fn) {
        let global = [];
        let promise = Promise.resolve();
        getParams(["Param1", "Param2"], function (res) {
            promise = promise.then(() => fn(res)).then(result => global.push(result));
        });
    return promise.then(() => global);
}
READ ALSO
Как прокинуть аргумент в одну из функции композиции библиотеки Ramda?

Как прокинуть аргумент в одну из функции композиции библиотеки Ramda?

Здравствуйте существует ли способ прокинуть аргументы в одну из функций входящих в композицию библиотеки Ramda Вот пример

183
Сложение числе в объекте с отображением в инпуте

Сложение числе в объекте с отображением в инпуте

При сложении чисел 1 и 2 с отображение в инпуте функция plus(), которая должна отобразить сумму 3, почему-то не работает

202
Что лучше начать изучать vue.js или react? [требует правки]

Что лучше начать изучать vue.js или react? [требует правки]

Я сам не так давно стал изучать js, но хочется уже щас понять в какую сторону смотреть?

205