#jquery #javascript
На этот вопрос уже даны ответы здесь:
Как вернуть значение из события или из функции обратного
вызова? Или хотя бы дождаться их окончания
(3 ответа)
Закрыт 3 года назад.
Сейчас я использую код вида:
function getData(key, id)
{
var data = '';
$.get(
'http://site.com/gate.php',
{'key': key, 'id': id, 'action': 'get'},
function (res) {
data = res.split('|')[1];
}
return data;
}
Вопрос: можно ли как-то возвращать результат из замыкания передаваемого в $.get()?
Что-то вроде этого:
function getData(key, id)
{
return $.get(
'http://site.com/gate.php',
{'key': key, 'id': id, 'action': 'get'},
function (res) {
return res.split('|')[1];
}
}
Ответы
Ответ 1
@Deonis всё правильно написал, но поддержка браузерами нативных Promises далека от идеала. Ждём Spartan Существуют множество полифиллов, в том числе и для JQuery. function getData(key, id){ var dfd = $.Deferred(), data = {'key': key, 'id': id, 'action': 'get'}; $.get('http://site.com/gate.php', data) .done(function (response) { response = 'foo|bar|baz'; // предположим, что response вернул такую строчку dfd.resolve(response); }) .fail(dfd.reject); return dfd; } getData(10, 100).then(function (response) { alert(response.split('|')[1]); }, function (error) { // обработчик ошибок }); Смотреть результат здесь Update Вы можете явно указать, чтобы $.ajax возвращал вам синхронно, но такой подход в корне неверный. function getData(key, id){ var result; $.ajax({ url: 'http://site.com/gate.php', type: 'GET', async: false, data: { key: key, id: id, action: 'get' }, }) .done(function(response){ response = 'foo|bar|baz'; // предположим, что response вернул такую строчку result = response.split('|')[1]; }) .fail(function(){ // обработчик ошибок }); return result; } alert(getData(10, 100)); Смотреть результат здесьОтвет 2
function getData(key, id) { return new Promise(function (resolve, reject) { $.ajax({ url: 'http://site.com/gate.php', type: 'GET', data: { key: key, id: id, action: 'get' }, error: reject, success: function (res) { resolve(res.split('|')[1]); } }); }); } getData(10, 100).then(function (response) { console.log("Всё гуд!", response); }, function (error) { alert('Хьюстон! У нас проблемы!: ' + error.statusText); });
Комментариев нет:
Отправить комментарий