jquery: ¿qué sucede cuando pasas un objeto diferido a "entonces"?

He estado investigando objetos diferidos de jquery durante un tiempo y estoy perplejo con una cosa.

Los métodos "hecho", "siempre", "entonces", etc. toman, como sus argumentos, funciones que deberían llamarse cuando se resuelve el objeto diferido.

in embargo, intenté encadenar solicitudes pasando un objeto diferido al método "siempre", y que parece para trabajar también:

// A is an array of data
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure);
for (var i = 1 ; i < A.length ; i++) {
  var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure);
  req.always(tmp);
  req = tmp;
}

Sin embargo, realmente no funciona. Porque cuando sigo el código anterior con esto:

req.always(foobar);

arece que se llama a @foobar en algún momento aleatorio, no necesariamente después de que se procesa el último elemento de la matriz.

¿Sería mejor usar cuándo?

// A is an array of data
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure));
for (var i = 1 ; i < A.length ; i++) {
  req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure));
}
req.always(foobar);

¿El código anterior (usando "cuándo") daría lugar a que las solicitudes de ajax sucedan una tras otra, o ocurrirían simultáneamente?

Por cierto, busqué encadenar con "pipe", pero debido a problemas de alcance creo que sería más difícil usar "pipe" con un bucle for como el anterior.

Además, ¿por qué el código original "casi funciona"? ¿Lo que está sucediendo allí? ¿Está ejecutando el objeto diferido como si fuera una función, y qué sucede cuando lo hace?

Respuestas a la pregunta(1)

Su respuesta a la pregunta