programing

대기하지 않을 때/그 때(때/완료할 때) jquery

oldcodes 2023. 8. 22. 22:28
반응형

대기하지 않을 때/그 때(때/완료할 때) jquery

저는 이 구문을 사용하는 많은 샘플을 살펴보았지만 제가 무엇을 잘못하고 있는지 알 수 없습니다.아약스 호출이 반환되기 전에 "그때" 함수가 실행되고 있습니다.

저는 $.delered와 몇 가지 다른 패턴도 사용해봤지만 소용이 없었습니다.

누가 제가 뭘 놓쳤는지 볼 수 있을까요?

디버그를 해봤더니 완료/완료된 내부에서 걸려온 호출이 Ajax 호출의 성공(또는 오류) 데이터를 반환하기 전에 확인됩니다.

도와주셔서 감사합니다.

기본 통화:

this.addFirstTask = function(task) {
    var totalHours = GetHours();
    $.when(totalHours).done(function (data) {
        task.TaskHours(data);
        self.add(task);
    });
};

다음과 같은 아약스 함수를 호출합니다.

function GetHours() {
    $.ajax({
        url: "/api/tst/GetMyData",
        type: 'GET',
        dataType: 'json',

        success: function(data) {
           return data;
        },

        error: function(data) {
            return 0;
        }
    });
};

감사합니다!

사후 처리:

추가 조언에 따라 Ajax 호출에 반환을 추가하는 것 외에도, Ajax 호출에서 성공과 오류를 제거하고 addFirstTask를 다음과 같이 변경했습니다.

this.addFirstTask = function(task) {
    var totalHours = GetHours();
    $.when(totalHours)
     .then(function (data) {task.TaskHours(data);})
     .done(function () { self.add(task); });
};

GetHours가 성공하면 TaskHours 값을 업데이트합니다.실패하면 그냥 건너뜁니다.'DONE'은 에서 'FINIEL'과 같다는 것을 깨달았습니다.NET의 시도/획득.따라서 작업을 즉시 추가한 다음 값이 반환될 때 내 관측 가능한 바인딩이 업데이트하도록 하는 대신 self.add도 비동기 호출의 일부입니다.

function GetHours() {
    return $.ajax({
        ...
    });
};

$.ajax()가 Promise를 반환합니다.$.() Promise 컬렉션을 가져오고 모든 입력 약속이 완료될 때 완료되는 Promise를 반환할 때 .then()은 Promise의 메서드(이 경우, () 생성될 때 래퍼 Promise는 약속이 성공적으로 해결될 때 첫 번째 함수 arg를 호출합니다.

따라서 GetHours는 () 언제 끝날 수 있는지에 대한 약속을 반환해야 하며 ()를 호출하면 실제로 when() 부분을 건너뛰고 GetHours에서 돌아올 때 .를 호출할 수 있습니다.

오류가 발생하지 않는 이유는 .() 이전 개체도 가져가고 Promise 인터페이스를 구현하지 않으면 이미 완료된 Promise처럼 처리하기 때문입니다.

이것은 OPs 문제가 아니지만, 저도 비슷한 일이 있었습니다. 제가 일련의 약속을 전달함으로써 $.when(...)을 잘못 불렀기 때문입니다.

jQuery에 대한 설명서에 따릅니다.여러 개의 지연된 개체를 기다리려면 다음과 같이 호출해야 합니다.

$.when( d1, d2 ).then(....);

즉, 배열에 지연된 개체가 여러 개 있는 경우 apply(...)사용해야 합니다. 그렇지 않으면 $.when이 제대로 작동하지 않습니다.따라서 지연된 객체 배열에 대한 호출은 다음과 같습니다.

$.when.apply(this, arrayOfDeferred).then(....);

다음은 JS 피들이 이를 시연하는 모습입니다.

https://jsfiddle.net/Lvo4hrez/11/

GetHours 함수에서 $.ajax 결과를 반환해야 합니다. 다음과 같습니다.

function GetHours() {
$.ajax({
    url: "/api/tst/GetMyData",
    type: 'GET',
    dataType: 'json',

    success: function(data) {
       return data;
    },

    error: function(data) {
        return 0;
    }
});

};

언급URL : https://stackoverflow.com/questions/21974649/jquery-when-then-also-when-done-not-waiting

반응형