Задать вопрос
Ramapriya
@Ramapriya

Как вытащить возвращаемое значение из ajax-запроса?

Добрый день!

Зарегистрировал свою js-библиотеку для работы с товарами в коробке Битрикс24.

Столкнулся с проблемой:

Делаю запрос к модулю через BX.ajax.runAction, для удобства обернул вызов в отдельную асинхронную функцию:

ProductData.post = async function (actionName, params = {}) {

    let action = 'ramapriya:productdata.api.calculator.' + actionName;

    const request = await BX.ajax.runAction(action, {
        method: 'POST',
        data: params
    });

    return await request.data;
}


Так вот, когда я вызываю данную функцию внутри другой, то не могу понять, как вытащить из неё данные для использования в других местах библиотеки:

const inputNames = this.post('getProductPropertiesNames', {
    productId: this.extractProductId(window.location.href)
});

let inputs;

inputNames.then(response => {
    console.log(response.inputs) // работает, возвращает нужный результат
    inputs = response.inputs;
})

console.log(inputs) // undefined


Подскажите, что и где я делаю не так.
Заранее спасибо.
  • Вопрос задан
  • 755 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
Tim-A-2020
@Tim-A-2020
У слова async один простой смысл: эта функция всегда возвращает промис. Значения других типов оборачиваются в завершившийся успешно промис автоматически - Источник . Чтобы получить данные нужно использовать асинхронную функцию либо через then.
Пример 1
...
ProductData.post().then(data => console.log(data));

Пример 2
(async function() {
    const response = await ProductData.post();
    console.log(response);
})()


Можно использовать callback
inputNames.then(response => {
    console.log(response.inputs) // работает, возвращает нужный результат
    test(response.inputs);
})

function test(inputs) {
	console.log(inputs)
}

inputs = undefined - потому что в момент исполнения промис еще не завершился.
Если принципиально хотите использовать синхронный запрос, то воспользуйтесь синхронным аяксом. На битриксе не знаю как это сделать. На время выполнения запроса будет блокироваться браузер.
let responce = $.ajax({async: false, ...}).responceText;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы