J’ai progressé mais je suis bloqué. Voici mes codes, simplifiés.
Pour préciser, ce n’est pas la première fois que j’utilise ajax, en revanche c’est la première fois que je cherche à récupérer une variable venant d’ajax pour l’afficher plus tard. D’ailleurs il y a peu ou pas d’exemples sur ce domaine dans stackoverflow sauf sur les promesses en javascript récent et zappant le côté ajax.
Tout d’abord la partie en R. Je présente cette partie pour dire que je ne peux pas mettre de js au dessus. (En réalité si, mais je voudrais éviter d’en mettre partout).
DT::datatable(
data=mesdonnees(),
callback = JS(" // mon code JS "
)
Voici le code js d’appel en on click:
table.on('click', 'td.details-control', function () {
// A priori td et row fonctionnent puisque je vois bien la bonne valeur dans le console.log de ajaxFn ()
var td = $(this),
row = table.row(td.closest('tr'));
if (row.child.isShown()) {
row.child.hide();
td.html('⊕');
} else {
setTimeout(function() {
//-- 1 --- chargement_ajax() est bien appelé. J'avais appelé 2 fois la fonction child() de datatables de suite, ce n'était pas bon mais ce n'était pas en cause car ça continuait à fonctionner...en synchrone. De toute façon j'ai corrigé mon erreur.
row.child(chargement_ajax(row.data())).show();
td.html('⊖');
}, 1); // avec des timeout de 2000 ms (2 sec) ça fonctionne en asynchrone, mais c'est insupportable
}
})
Et le code appelé par le code précédent
var chargement_ajax = function (d) {
// essai de variable globale pour result0, mais c'est naze et ça ne donne rien
var result0='rien0';
var result2='rien2' ;
var timeOutId;
// d[2] c'est le nb de lignes attendues pré-calculées
if(d[2]>0) {
function ajaxFn () {
return $.ajax(mon_url, {
async: true,
data: {MonParam: d[1]},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
},
}).done(function(data) {
if (typeof data !== 'undefined') {
result_ajax_json= data;
tableau_html=result_ajax_json.toString();
result0 ='<b>éléments trouvée: </b> </br>'+
'<div class=\"TableauPlusHtml\">'+tableau_html+'</div>';
clearTimeout(timeOutId);
} else {
// j'ai vu ce système sur stackoverflow, et je n'ai pas de soucis a priori.
timeOutId = setTimeout(ajaxFn, 10);
}
//-- 3 --- ça fonctionne jusqu'ici je récupère les bonnes valeurs quand je regarde avec F12
return result0;
});
}
//-- 2 --- Je passe bien là car ajaxFn() est bien appelé, et je vois bien dans F12 le GET avec les bonnes valeurs,
var promise = ajaxFn();
//-- 4 --- mais je n'arrive pas à récupérer la valeur de sortie du done()
// J'ai même essayé avec en mettant en variable globale result0 mais c'est mal et de toute façon ça ne marche pas
result2= ???? fonction de promise ?;
} else {
// là ça marche bien, normal je ne suis pas passé par l'ajax
return result2;
}
}