Den Callback in Array.sort kannst Du aber keinesfalls durch ein Promise ersetzen, weil er ja eine Funktion darstellt, die zwei Arrayelemente vergleicht, also synchron zum Sort laufen muss.
Etwas anderes wäre eine Sortierfunktion, die ein Promise zurückgibt, welches erfüllt ist sobald der sort fertig ist. Man könnte das Sortieren dann in einem separaten Thread durchführen und währenddessen andere nützliche Arbeit tun. Zum Beispiel ein zweites Array sortieren.
Wäre doch ein nettes Beispiel. Angenommen, ich hätte eine Funktion Array.sortAsync, die ein Array in einem Hintergrundthread sortieren kann (wie auch immer die das tut - das ist jetzt wurscht) und mir ein Promise zurückgibt. Diese Funktion ist nicht Teil von JS, sondern nur ein Gedankenbeispiel. Dann könnte ich schreiben:
var myArray = [ 4,7,1,1];
var result;
Array
.sortAsync(myArray) // HYPOTHETISCHE FUNKTION !!!
.done(function(sorted) {
console.log(sorted[0]); // Wäre machbar
result = sorted;
});
// Hier geht's schon weiter, während noch sortiert wird!
// deshalb kommt ein Fehler, dass result undefiniert sei
console.log(result[0]);
Das ist ja ganz nett und zeigt auch den ersten Fallstrick, aber es ist nicht wirklich sinnvoll, weil ich ja nix sinnvolles tue während der Sort läuft. Anders wäre sowas hier:
var myArray = [ 4, 7, 1, 1 ], yourArray = [ 0, 8, 1, 5 ];
var mySortedArray, yourSortedArray;
var promise1 = Array.sortAsync(myArray).then(function(s) { mySortedArray = s; });;
var yourSortedArray = Array.sort(yourArray);
// Und jetzt? mySortedArray und yourSortedArray vergleichen?
Das ist so noch nicht unbedingt brauchbar. Wenn Du mySortedArray und yourSortedArray unabhängig voneinander weiterverarbeiten kannst, dann kann man es so lassen. Aber wenn du z.B. beide vergleichen willst, brauchst Du eine Synchronisierung beider Sortierungen, und dafür verwendet man wieder ein Promise:
var myArray = [ 4, 7, 1, 1 ], yourArray = [ 0, 8, 1, 5 ];
var promise1 = Array.sortAsync(myArray);
var promise2 = Array.sortAsync(yourArray);
Promise.all([promise1,promise2]).done(function(werte) {
var mySortedArray = werte[0];
var yourSortedArray = werte[1];
// Arrays im done-Handler verarbeiten
});
Promise.all liefert dir ein DRITTES Promise, dass sich in dem Moment erfüllt wo alle Teilpromises erfüllt sind.
Rolf