如何使用多个并行$ .post和async lib管理时序依赖性?

我有这个jQuery代码,其中第二个$.post()依赖于第一个$.post()执行,这可能是一个问题,如果第一个尚未完成或执行期间失败或之前的第二个启动。 也许我可以使用某种链式调用来解决这个问题,但我认为它根本不是很好。 如何使用适用于考试的Coalan Async ?

  var paisesFromEntity; $.post(Routing.generate('productoGuardarPasoCinco'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) { if (data.entities !== "undefined" || data.entities != "") { paisesFromEntity = data.entities.paises; } }).fail(function () { return false; }); var returnList = function (entities) { if (entities.length > 0) { var items = []; entities.forEach(function (value, index, array) { items.push(value.pais); }); return items.join(', '); } }, fullList = [], getValues = function(arr){ var ret = []; $.each(arr,function(i,entry) { ret.push(entry.pais); }); return(ret); }; $.post(Routing.generate('agregarPaisesDistribuidor'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) { fullList = fullList.concat(paisesFromEntity, getValues(data.entities)); $('#td-' + data.idToUpdate).html(returnList(fullList)); }).fail(function () { return false; }); 

根据要求,async lib非常棒 – 在节点服务器端或浏览器中。 这是lib https://github.com/caolan/async

由于您是并行执行这些操作,因此您希望:

 function doLotsOfStuff(done) { async.parallel([ function(cb) { $.post(Routing.generate('productoGuardarPasoCinco'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) { if (data.entities !== "undefined" || data.entities != "") { cb(null,data.entities.paises); } else { cb(); } }).fail(function () { cb("error"); }); }, function(cb) { $.post(Routing.generate('agregarPaisesDistribuidor'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) { cb(null,getValues(data.entities)); }).fail(function () { cb("error"); }); } ],function(err,results) { var fullList = [].concat(results[0], results[1]); $('#td-' + data.idToUpdate).html(returnList(fullList)); done(); }); } 

你的代码可能会成为

 var paisesFromEntity; var deferred1 = $.post(Routing.generate('productoGuardarPasoCinco'), $form.serialize(), 'json'); var returnList = function (entities) { if (entities.length > 0) { var items = []; entities.forEach(function (value, index, array) { items.push(value.pais); }); return items.join(', '); } }, fullList = [], getValues = function(arr){ var ret = []; $.each(arr,function(i,entry) { ret.push(entry.pais); }); return(ret); }; var deferred2 = $.post(Routing.generate('agregarPaisesDistribuidor'), $form.serialize(), 'json'); $.when(deferred1, deferred2) .then(function(resp1, resp2) { if (resp1[0].entities !== "undefined" || resp1[0].entities != "") { paisesFromEntity = resp1.entities.paises; fullList = fullList.concat(paisesFromEntity, getValues(resp2[0].entities)); $('#td-' + data.idToUpdate).html(returnList(fullList)); } });