#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); });
Комментариев нет:
Отправить комментарий