Имам джаджа на JavaScript, която предоставя стандартни точки за разширение. Една от тях е функцията beforecreate
. Тя трябва да връща false
, за да предотврати създаването на елемент.
Добавих Ajax извикване в тази функция, използвайки jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Но искам да предотвратя създаването на елемента от моята джаджа, така че трябва да върна false
във функцията майка, а не в обратното извикване. Има ли начин да се извърши синхронна AJAX заявка, като се използва jQuery или друг API в браузъра?
От документацията на jQuery: задавате опцията asynchronous да бъде false, за да получите синхронна Ajax заявка. След това вашата обратна връзка може да зададе някои данни, преди да продължи работата на вашата функция майка.
Ето как би изглеждал кодът ви, ако бъде променен, както е предложено:
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
Можете да поставите настройката на jQuery's Ajax в синхронен режим, като извикате
jQuery.ajaxSetup({async:false});
И след това изпълнявайте вашите Ajax повиквания, като използвате jQuery.get( ... );
След това просто го включете отново, след като
jQuery.ajaxSetup({async:true});
Предполагам, че се получава същото, което предложи @Adam, но може да е полезно за някой, който иска да пренастрои своя jQuery.get()
или jQuery.post()
към по-сложния синтаксис jQuery.ajax()
.
Отлично решение! Когато се опитах да го приложа, забелязах, че ако върна стойност в клаузата за успех, тя се връща като неопределена. Трябваше да я съхраня в променлива и да върна тази променлива. Това е методът, който измислих:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}