@zzmaster

Jquery 3: почему не работает код с Promise?

У меня есть функция, которая отправляет некие списки на сервер, и по успешному отправлению должен запуститься процесс.

save_lists()
	.then(x=>{
		alert('Going');
	})

	save_lists() {
		return new Promise(function(resolve, reject) {
			$.post('/en/save-lists', {})
				.done(data=>{
					alert('Success:'+data);
					resolve;
				})
				.fail(x=>{
					alert('Error happened');
					reject;
				}); 
		})
	}


Выводится Success, но не выводиться Going. Что тут не так?
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
@versetty777
В функции save_lists() вам нужно вызывать resolve(data) в случае успешного завершения запроса, и reject(error) в случае ошибки.
В вашем случае, resolve и reject не передают никаких значений, поэтому функция .then(x=>{alert('Going');}) не выполняется.
Исправленный код будет выглядеть так:

save_lists()
  .then(x=>{
    alert('Going');
  })

save_lists() {
    return new Promise(function(resolve, reject) {
      $.post('/en/save-lists', {})
        .done(data=>{
          alert('Success:'+data);
          resolve(data);
        })
        .fail(x=>{
          alert('Error happened');
          reject(x);
        }); 
    })
  }


Это означает, что когда запрос завершится успешно, функция resolve будет вызвана с передачей данных, которые вернул сервер, и функция .then(x=>{alert('Going');}) будет выполнена.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
У библиотеки jQuery имеется свой аналог промисов - это так называемые объекты Deffered. Данные объекты полностью обратно совместимы с промисами, вплоть до возможности использовать await с ними.

Функции $.ajax $.get и $.post возвращают как раз этот самый объект Deferred (совместимый с промисами).

$.post('/en/save-lists', {}).then(function(res) {
	console.log('Успех', res);
}, function(err) {
	console.error('Ошибка', err);
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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