Jquery Ajax prevent fail in a deferred sequential loop

前端 未结 1 1096
醉话见心
醉话见心 2020-11-28 16:38

So, I\'m chaining together sequential ajax, to load an array of urls in order. Originally I used .then() instead of .always(), and either way it wo

相关标签:
1条回答
  • 2020-11-28 17:23

    Try

    (function ($) {
        $.when.all = whenAll;
        function whenAll(arr) {
            "use strict";
            var deferred = new $.Deferred(),
                args = !! arr 
                       ? $.isArray(arr) 
                         ? arr 
                         : Array.prototype.slice.call(arguments)
                           .map(function (p) {
                             return p.hasOwnProperty("promise") 
                             ? p 
                             : new $.Deferred()
                               .resolve(p, null, deferred.promise())
                           }) 
                       : [deferred.resolve(deferred.promise())],
                promises = {
                    "success": [],
                      "error": []
                }, doneCallback = function (res) {
                    promises[this.state() === "resolved" 
                             || res.textStatus === "success" 
                             ? "success" 
                             : "error"].push(res);
                    return (promises.success.length 
                           + promises.error.length) === args.length 
                           ? deferred.resolve(promises) 
                           : res
                }, failCallback = function (res) {
                    // do `error` notification , processing stuff
                    // console.log(res.textStatus);
                    promises[this.state() === "rejected" 
                            || res.textStatus === "error" 
                            ? "error" 
                            : "success"].push(res);
                    return (promises.success.length 
                           + promises.error.length) === args.length 
                           ? deferred.resolve(promises) 
                           : res
                };
            $.map(args, function (promise, index) {
                return $.when(promise).always(function (data, textStatus, jqxhr) {
                    return (textStatus === "success") 
                        ? doneCallback.call(jqxhr, {
                            data: data,
                            textStatus: textStatus 
                                        ? textStatus 
                                        : jqxhr.state() === "resolved" 
                                          ? "success" 
                                          : "error",
                            jqxhr: jqxhr
                          }) 
                        : failCallback.call(data, {
                            data: data,
                            textStatus: textStatus,
                            jqxhr: jqxhr
                          })
                })
            });
            return deferred.promise()
        };
    }(jQuery));
    // returns `Object {
    //                   success: Array[/* success responses*/], 
    //                   error: Array[/* error responses */]
    //          }`
    

    // e.g.,
    var request = function (url, data) {
        return $.post(url, {
            json: JSON.stringify(data)
        })
    }, settings = [
        ["/echo/json/", "success1"], // `success`
        ["/echo/jsons/", "error1"], // `error`
        ["/echo/json/", "success2"], // `success`
        ["/echo/jsons/", "error2"], // `error`
        ["/echo/json/", "success3"] // `success`
    ];
    
    $.when.all(
      $.map(settings, function (p) {
        return request.apply($, p)
      })
    )
    .then(function (data) {
        console.log(data);
        // filter , process responses
        $.each(data, function(key, value) {
            if (key === "success") {
              results.append(
                  "\r\n" + key + ":\r\n" + JSON.stringify(value, null, 4)
              )
            } else {            
              results.append(
                  "\r\n" + key + ":\r\n" 
                  + JSON.stringify(
                      value.map(function(v, k) {
                        v.data.responseText = $(v.data.responseText)
                          .filter("title, #summary, #explanation")
                          .text().replace(/\s+/g, " ");
                        return v
                      })
                    , null, 4)
              )
            }
        })
    }, function (e) {
        console.log("error", e)
    });
    

    jsfiddle http://jsfiddle.net/guest271314/620p8q8h/

    0 讨论(0)
提交回复
热议问题