jQuery Différés et la Promesse d'une exécution séquentielle synchrone et asynchrone fonctions

Si je veux avoir synchrone et asynchrone fonctions de s'exécuter dans un ordre particulier, je pourrais utiliser jQuery promesse, mais il ne semble pas fonctionner de la façon dont je m'attends à ce qu'il fonctionne.

Fonctions a,b et c doit s'exécuter dans l'ordre quand dans le deferred.resolve() est appelé, je m'attends à de la fonction b pour être exécuté, mais toutes les fonctions sont exécutées immédiatement, peu importe si la volonté est appelée.

Voici le code:

function a(){
  var deferred = $.Deferred();
  setTimeout(function(){
    console.log("status in a:",deferred.state());
    //this should trigger calling a or not?
    deferred.resolve("from a");
  },200);
  console.log("a");
  return deferred.promise();
};
function b(){
  var deferred = $.Deferred();
  setTimeout(function(){
    console.log("status in b:",deferred.state());
    deferred.resolve("from b");
  },200);
  console.log("b");
  return deferred.promise();
}
//synchronous function
function c(){
  var deferred = $.Deferred();
  console.log("c");
  console.log("status in c:",deferred.state());
  deferred.resolve("from c");
  return deferred.promise();
}
function test(){
  fn=[a,b,c],i=-1,
  len = fn.length,d,
  d = jQuery.Deferred(),
  p=d.promise();
  while(++i<len){
    p=p.then(fn[i]);
  }
  p.then(function(){
    console.log("done");
  },
  function(){
    console.log("Failed");
  });
  d.resolve();
  //instead of the loop doing the following has the same output
  //p.then(a).then(b).then(c);
  //d.resolve();
}
test();

De sortie est:

a
b
status in c: pending
c
done
status in a: pending
status in b: pending

Résultat attendu:

a
status in a: pending
b
status in b: pending
c
status in c: pending
done

Essayé quelques combinaisons des modifications suivantes:

  d = jQuery.Deferred();
  setTimeout(function(){d.resolve();},100);
  var p=d.promise();
  while(++i<len){
    p.then(fn[i]);
  }

Mais tous avec les mêmes résultats inattendus, b est appelée avant différé de un est résolu, c est appelée avant différé de b est résolu.

OriginalL'auteur HMR | 2013-11-21