2014-11-25 26 views
1

我有這個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; 
    }); 
+0

你已經回答了你自己的問題。如果你想使用[鏈接庫](https://github.com/caolan/async),只需閱讀它的文檔。不要在SO上發佈問題,要求其他人實現您的功能。 – hon2a 2014-11-25 13:16:18

+0

@ hon2a這是另一個問題的分支。我建議修改答案會分散注意力,所以請他將其分開。 – deitch 2014-11-25 13:17:31

+1

這並沒有改變OP應該對[使用Promise](http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/)進行自己的研究的事實把問題放在這裏。 – hon2a 2014-11-25 13:20:21

回答

1

根據要求,異步庫只是很棒 - 在節點服務器端或瀏覽器中。這裏是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(); 
    }); 
} 
1

你的代碼可能成爲

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)); 
    } 
    });