У Вас функция success_add_favorite() выполняется сразу а не в callback`е success.
Напишите так, без немедленного вызова:
success: success_add_favorite
В jQuery после 1.9 версии параметра type: 'POST' нету, есть method: 'POST'
При использовании функции $.ajax лучше возвращать её Deferred объект, так вы будете знать промис когда она выполнилась не только в callback success или error:
function someFunction(userID, postID) {
return $.ajax({...});
}
someFunction(a, b).done(function () {
//> Запрос прошел успешно
});
Вы отправляете json, так укажите это в Content-Type: 'application/json'. И укажите тип который принимаете, например dataType: 'json'
Можете написать свою функции promise используя deferred объекты, например так:
getUsers().done(function (users) {
console.log(users);
});
function promise(callback) {
var deferred = $.Deferred();
callback && callback(deferred.resolve, deferred.reject);
return deferred;
}
function getUsers() {
return promise(function (resolve, reject) {
$.ajax({
url: 'https://jsonplaceholder.typicode.com/users',
method: 'GET',
dataType: 'json',
success: function (users) {
resolve(users.filter(function (user) {
return user.id <= 5;
}));
},
error: reject
});
});
}
А также аналог Promise.all:
promiseAll([promise, promise, promise]).done(function () {
//> Все промисы завершенны успешно
});
function promiseAll(promises) {
return $.when.apply(null, promises);
}
Вот вам пример правильного оформленного post запроса:
addPost({
title: 'foo',
body: 'bar',
userId: 1
}).done(function (response) {
console.log(response); //> {title: "foo", body: "bar", userId: 1, id: 101}
});
function addPost(data) {
return $.ajax({
url: 'https://jsonplaceholder.typicode.com/posts',
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(data)
});
}