代码之家  ›  专栏  ›  技术社区  ›  Ahmad

Jquery延迟的顺序执行

  •  0
  • Ahmad  · 技术社区  · 9 年前

    在下面的代码中,我希望在while循环中顺序执行saveBulkUploadSinglePacket方法,这意味着在当前数据包完成后处理下一个数据包。如何实现这一点。

    var saveBulkUploadSinglePacket = function(){
    while (packetCount<=bulkUploadPackets.length){
                $.when(saveBulkUploadSinglePacket(modelToSave)).done(function(arguments){
                    saveBulkUploadPackets.push(arguments);
                    packetCount++;
                });
    
            }
      return saveBulkUploadPackets;
    
    }
    
    
    
    var saveBulkUploadSinglePacket = function(modelToSave){
            var defer = $.Deferred();
            $.when(new SaveBulkUpload().save(modelToSave)).done(function(arguments){
                defer.resolve(arguments);
            }).fail(function(errorObj){  
               defer.reject(errorObj);
            });
    
            return defer.promise();
    
        }
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Ken Bellows    9 年前

    说“承诺完成时执行x”的标准方式是通过 promise.then() .在循环外的var中跟踪当前的promise,并将每个调用与前一个promise附加 .then() :

    var saveBulkUploadSinglePacket = function(){
        var lastPromise = $.when();
        while (packetCount<=bulkUploadPackets.length){
            lastPromise = (
               lastPromise
                 .then(function(){
                     // make sure saveBulkUploadSinglePacket returns a promise
                     return saveBulkUploadSinglePacket(modelToSave));
                 })
                 .then(function(){
                     saveBulkUploadPackets.push(arguments);
                     packetCount++;
                     // return a resolved promise
                     return $.when();
                 })
            );
        }
        lastPromise.resolve(saveBulkUploadPackets);
        return lastPromise;
    }
    

    在函数的末尾,我用期望的返回值解析了最终的promise,然后返回了promise。这样你就可以打电话了 saveBulUploadSinglePacket().then(...) 等待所有承诺完成并处理结果。

        2
  •  0
  •   Roamer-1888    9 年前

    要按顺序保存您的包,请使用 Array.prototype.reduce() 构建 .then() 链非常简洁,如下所示:

    var saveBulkUploadPackets = function(packets) {
        return packets.reduce(function(promise, paket) {
            return promise.then(function(results) {
                return (new SaveBulkUpload()).save(paket).then(function(res) {
                    return results.concat(res);
                });
            });
        }, $.when([]));
    }
    

    然后这样叫:

    saveBulkUploadPackets(bulkUploadPackets).then(function(results) {
        // All done.
        // use/log the `results` array here.
    });