복붙노트

[JQUERY] 어떻게 jQuery를 Deferreds의 배열과 함께 작동합니까?

JQUERY

어떻게 jQuery를 Deferreds의 배열과 함께 작동합니까?

해결법


  1. 1.당신이 찾고있는

    당신이 찾고있는

    $.when.apply($, promises).then(function(schemas) {
         console.log("DONE", this, schemas);
    }, function(e) {
         console.log("My ajax failed");
    });
    

    이 것 또한 작업 (작업의 일부 값에 대해, 그것이 깨진 아약스가 해결되지 않습니다)

    $.when.apply($, promises).done(function() { ... }).fail(function() { ... });` 
    

    이 내부 $ .when jQuery를 참조하도록 당신은 $ 대신에 널 (null)을 통과 할 수 있습니다. 이 소스에 문제가되지해야하지만 더는 null을 전달합니다.

    $ .when 및 샘플 작품을 교체하여 모든 $ 아약스을 조롱

    이 중 하나를 귀하의 아약스 요청 문제 나 배열은 fetch_schemas에 통과 그래서.


  2. 2.위의 해결 방법 (감사합니다!) 제대로 jQuery를 호출하기 때문에의 연기 해결 () 메소드에 제공된 개체를 다시 얻기의 문제를 해결 완료 ()와 () 개별 매개 변수가 아닌 배열 콜백을 실패하지 않습니다. 우리가 인수를 사용하는 것을 의미 사이비 배열을 추한 deferreds의 배열에 의해 반환 된 모든 해결 / 거부 개체를 얻을 :

    위의 해결 방법 (감사합니다!) 제대로 jQuery를 호출하기 때문에의 연기 해결 () 메소드에 제공된 개체를 다시 얻기의 문제를 해결 완료 ()와 () 개별 매개 변수가 아닌 배열 콜백을 실패하지 않습니다. 우리가 인수를 사용하는 것을 의미 사이비 배열을 추한 deferreds의 배열에 의해 반환 된 모든 해결 / 거부 개체를 얻을 :

    $.when.apply($, promises).then(function() {
         var schemas=arguments; // The array of resolved objects as a pseudo-array
         ...
    };
    

    우리가 deferreds의 배열에 전달하기 때문에, 결과의 배열을 다시 얻을 좋을 것이다. 우리가에 Array.sort 같은 방법을 사용할 수 있도록 그것은 대신 의사 배열의 실제 배열을 다시 얻을 좋을 것이다 ().

    여기에 솔루션은 when.js의 when.all () 메소드가 주소 이러한 문제에서 영감 :

    // Put somewhere in your scripting environment
    if (jQuery.when.all===undefined) {
        jQuery.when.all = function(deferreds) {
            var deferred = new jQuery.Deferred();
            $.when.apply(jQuery, deferreds).then(
                function() {
                    deferred.resolve(Array.prototype.slice.call(arguments));
                },
                function() {
                    deferred.fail(Array.prototype.slice.call(arguments));
                });
    
            return deferred;
        }
    }
    

    지금 당신은 단순히 deferreds / 약속의 배열에 전달하고 그래서 같이 콜백에서 해결 / 거부 객체의 배열을 다시 얻을 수 있습니다 :

    $.when.all(promises).then(function(schemas) {
         console.log("DONE", this, schemas); // 'schemas' is now an array
    }, function(e) {
         console.log("My ajax failed");
    });
    

  3. 3.당신은 자바 스크립트의 ES6 버전을 사용하는 경우 쉼표 인수를 분리에 객체의 배열을 변환하는 확산 연산자 (...)이있다.

    당신은 자바 스크립트의 ES6 버전을 사용하는 경우 쉼표 인수를 분리에 객체의 배열을 변환하는 확산 연산자 (...)이있다.

    $.when(...promises).then(function() {
     var schemas=arguments; 
    };
    

    더 ES6 확산 연산자에 대한 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator 여기에서 찾을 수 있습니다


  4. 4.때이 코드를 확장 :

    때이 코드를 확장 :

    var rawWhen = $.when
    $.when = function(promise) {
        if ($.isArray(promise)) {
            var dfd = new jQuery.Deferred()
            rawWhen.apply($, promise).done(function() {
                dfd.resolve(Array.prototype.slice.call(arguments))
            }).fail(function() {
                dfd.reject(Array.prototype.slice.call(arguments))
            })
            return dfd.promise()
        } else {
            return rawWhen.apply($, arguments)
        }
    }
    
  5. from https://stackoverflow.com/questions/4878887/how-do-you-work-with-an-array-of-jquery-deferreds by cc-by-sa and MIT license