문제

저는 지연 또는 jQuery 스크립트로 언제 사용하는 것으로 고민합니다. 저는 여기서 다른 곳과 다른 곳에서 여러 기사를 겪었습니다 (api.jquery.com 포함) 나는이 전화를 사용하는 방법을 정확히 이해하기 위해 조금 너무 초보자를 이해했습니다.

스크립트의 이전 함수가 완료 될 때까지 기능을 연기하지 않으려고합니다.

나는

가있다
function datapoints () {
    //My long function here where I define $data
};
.

결과가 $ DATA 데이터라는 배열입니다. 내 다음 기능으로 정의 할 $ DATA 변수가 필요하므로 연기를 원합니다.

다음과 같이 연기를 설정하려고 시도했습니다 :

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
.

이 일을 정리하는 방법에 대한 포인터를 정말로 감사드립니다. 나는 다양한 예를 다시 만들었지 만 결과는 $ 데이터가 정의되지 않은 콘솔 오류입니다. 코드는 두 번째 기능을 실행하기 전에 몇 초의 SetTimeout을 수동으로 넣으면 모든 것이 잘 작동하지만 연기가 더 나은 해결책이라고 생각합니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

다음과 같이 코드를 수정하십시오 :

deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
.

사용중인 데이터가 실제로 datapoints()에서 반환 된 데이터가 있는지 확인합니다.

datapoints()가 비동기 기능이 아니면 쓴 코드는 JS 스레드 (즉, 브라우저에서 실행되는 경우 UI를 차단합니다)를 차단합니다.

동기 기능이있는 약속 / 연기가 많이 사용되지 않습니다.

일반적인 패턴은 다음과 같을 것입니다 :

function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})
.

다른 팁

이 코드를 사용해보십시오 :

function datapoints () {
    var deferred = $.Deferred();

    /* later, when data is ready, call:

        deffered.resolve(data);
    */

    return deferred.promise();
}


datapoints().then(function () {
    // runs when data is ready         
})
.

당신의 문제가 무엇인지 확실히 확신하지는 않지만,이 jsfiddle 는 나에게 잘 작동합니다.

function datapoints () {
    //My long function here where I define $data
    return {"datapoint1": 1, "datapoint2": 2};
};

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (data){
    // My function here where I use $data
    console.log("data: ", data);
});
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top