Je sais depuis une conf’ passée (il y a deux ans je crois) que les promesses — Promise en english — javascript ont l’air rudement cool mais il doit y avoir un truc qui coince dans ma tête, j’arrive pas à capter le concept. Pourtant c’est pas faute d’avoir déjà codé de la cascade infernale (même si pas si infernale que ça finalement), entre autres dans la dernière version du plugin sysInfo.
Alors j’essaie de retrouver un tuto sur le sujet, vu que j’ai l’intuition que ça doit plutôt bien s’appliquer à ce bout de code, pour l’instant présent dans le plugin :
var dotclearAjax = function(method, data, fn) {
var content = null;
var params = {
xd_check: dotclear.nonce,
f: method
};
$.extend(params, data);
$.get('services.php', params, function(data) {
if ($('rsp[status=failed]', data).length > 0) {
// For debugging purpose only:
// console.log($('rsp',data).attr('message'));
console.log('Dotclear REST server error');
} else {
// ret -> status (true/false)
// msg -> REST method return value
var ret = Number($('rsp>sysinfo', data).attr('ret'));
content = $('rsp>sysinfo', data).attr('msg');
if (ret && fn !== undefined && $.isFunction(fn)) {
// Call callback function with returned value
fn(content);
}
}
});
}
Sauf que voilà, je commence à coder un truc qui ressemble à ça :
function dotclearAjax(method, data, fn) {
return new Promise(function(resolve, reject) {
if (ok) {
resolve(value); // success
} else {
reject(error); // failure
}
});
}
Et qu’ensuite … poule couteau, tu vois ?
C’est assez frustrant en fait.
Après quelques essais, et parce que ça m’agace de ne pas arriver à mes fins, j’ai fini par obtenir ceci :
var dotclearAjax = function(method, args, fn) {
var content = null;
var params = {
xd_check: dotclear.nonce,
f: method
};
$.extend(params, args);
var promise = $.ajax({
url: 'services.php',
data: params,
dataType: 'xml'
});
promise.done(function(data) {
if ($('rsp[status=failed]', data).length > 0) {
// For debugging purpose only:
// console.log($('rsp',data).attr('message'));
console.log('Dotclear REST server error');
} else {
// ret -> status (true/false)
// msg -> REST method return value
var ret = Number($('rsp>sysinfo', data).attr('ret'));
content = $('rsp>sysinfo', data).attr('msg');
if (ret && fn !== undefined && $.isFunction(fn)) {
// Call callback function with returned value
fn(content);
}
}
});
}
En utilisant le retour de la fonction ajax de jQuery comme une promesse et en utilisant la méthode done qui ressemble vaguement au then des promesses Javascript.