Ich habe ein Problem mit js verspricht, dass ich hoffe, dass jemand mir helfen kann. Die folgende Funktion myFunction führt einen $ .ajax-Aufruf aus und gibt daher ein Versprechen zurück. Als ich zurück an den Browser, um die aufgefrischt div zeigen Kontrolle zur Hand benötigen, die diese Funktion Updates wie ich Rekursion, ich rufe einen SetTimeout wie folgt:
var nextBitOfWork = function() {
return myFunction(email);
};
setTimeout(nextBitOfWork, 0);
wo myFunction jetzt (die recurses) liefert ein versprich es, wenn es fertig ist, es ist $ .ajax call.
Wenn ich einfach anrufen:
return myFunction(email);
ohne die setTimeout-Funktion oben konstruieren, ist das Versprechen durchlaufen und alle meine Versprechen eingefangen und mir das Array Ausgabe erhalten ich brauche und alles funktioniert gut, wenn die Rekursion endet. Aber ohne setTimeout bekomme ich den Browser nicht aktualisiert. Wenn ich es wie oben benutze, bekomme ich die div update refresh Anzeige, aber anscheinend verliere ich das Versprechen und so läuft das Skript weiter und ich bekomme nicht das Array zu füllen, das myFunction erstellt, wenn es rekursiv ist.
Haben Sie sich Gedanken darüber gemacht, wie Sie sicherstellen können, dass setTimeout das Versprechen zuverlässig übergibt, so dass ich das Antwort-Array baue und die div-Updates anzeigen werde, wenn ich das tue?
Vielen Dank im Voraus für Ihre Hilfe!
OK - haben nun folgendes:
var func = function() {
myFunction(email);
};
return refreshscreen(func,0);
wo refreshscreen ist:
function refreshscreen(func,time) {
var timer = $.Deferred();
setTimeout(function() {
return func().then(timer.resolve());
}, time);
return timer.promise();
}
Immer noch das gleiche Problem - obwohl der Browser die div macht, ich das Array bauen mit myFunction für das gesammelte $ .ajax Antworten ist nur 1 Element in der Länge - obwohl es 20 mal rekursiert! Ohne den Aufruf, Bildschirm zu aktualisieren, baut das Array gut, aber der Browser rendert nie die Divs wie wir Recurse!
Wie wäre es stattdessen Callbacks zu verwenden, indem Sie (wenn nötig) die Anfragen in die Warteschlange stellen? – briosheje
Würde bedeuten, einen sehr großen Code neu zu schreiben - weiß, dass dies mit Versprechen möglich ist, aber nicht sicher, wie man die settimeout (s) baut, um damit umzugehen! –
In Ihrer Bearbeitung muss 'func' das Versprechen von' myFunction' zurückgeben. (Sie können auch die 'return' in' setTimeout' entfernen) – csum