programing

Angular를 사용하여 해결된 약속 즉시 반환JS

lastmoon 2023. 3. 18. 09:18
반응형

Angular를 사용하여 해결된 약속 즉시 반환JS

JavaScript(특히 Angular)의 약속을 이해하려고 합니다.JS)

서비스에 기능이 있습니다. 이 기능을 호출합니다.fooService데이터를 로드했는지 확인합니다.만약 있다면, 저는 그냥 돌려받고 싶습니다. 만약 돌려받지 않았다면, 우리는 데이터를 로드하고 약속을 해야 합니다.

this.update = function(data_loaded) {
    if (data_loaded) return;  // We've loaded the data, no need to update

    var promise = Restangular.all('someBase').customGet('foo/bar').then(function(data) {
        // Do something with the data here
    }

    return promise;
}

다른 함수가 있는데 이 함수는update기능fooService다음과 같이 합니다.

fooService.update(data_loaded).then(function() {
    // Do something here when update is finished
})

여기서의 문제는 데이터를 로딩할 필요가 없는 경우입니다.update이 함수는 약속이 반환되지 않기 때문에.then()다른 함수에서는 호출되지 않습니다.여기서의 접근방식은 무엇입니까?기본적으로 저는 해결된 약속을 즉시 반환하고 싶습니다.update()restangular 호출에서 데이터를 가져올 필요가 없는 경우 기능합니까?

약속은 JavaScript 네이티브와 동일한 구문을 사용하므로 이미 해결된 JavaScript 약속 Promise.resolve()를 사용하여 반환할 수 있습니다.

return(Promise.resolve("MyReturnValue"));

현재 받아들여지고 있는 답변은 지나치게 복잡하고 지연된 반() 패턴을 악용하고 있습니다.보다 심플한 어프로치를 다음에 나타냅니다.

this.update = function(data_loaded) {
    if (data_loaded) return $q.when(data);  // We've loaded the data, no need to update

    return Restangular.all('someBase').customGet('foo/bar')
                             .then(function(data) {
        // Do something with the data here 
    });
};

또는 더 나아가서:

this._updatep = null;
this.update = function(data_loaded) { // cached
    this._updatep = this._updatep || Restangular.all('someBase') // process in
                                                .customGet('foo/bar'); //.then(..
    return this._updatep;
};

AngularJS의 $q 서비스가 도움이 됩니다.그것은 크리스 코왈의 Q 약속 도서관과 매우 유사하다.

약속 또는 값을 반환할 수 있는 비동기 메서드가 있는 경우 $q.when 메서드를 사용합니다.약속이든 가치든 간에 주어진 모든 것을 받아들이고, 전달된 약속에 따라 해결/거부되거나, 값이 전달되면 해결되는 약속을 만듭니다.

$q.when( fooService.update(data_loaded) ).then(function(data){
   //data will either be the data returned or the data
   //passed through from the promise
})

그리고 업데이트 기능에서 데이터를 반환하는 대신

if (data_loaded) return data_loaded;

Elo의 답변과 마찬가지로 비동기/대기 구문을 사용하여 이미 해결된 약속을 반환할 수 있습니다.

this.update = async (data_loaded) => {

    if (data_loaded) 
        return await null;  // Instead of null, you could also return something else
                            // like a string "Resolved" or an object { status: 200 }
    else 
        return await OtherPromise();
}

를 사용할 수 있습니다.$q.defer()다음과 같습니다.

this.update = function (data_loaded) {
    var deferred = $q.defer();

    if (data_loaded) {
        deferred.resolve(null); // put something that your callback will know the data is loaded or just put your loaded data here.
    } else {
        Restangular.all('someBase').customGet('foo/bar').then(function(data) {
            // Do something here when update is finished
            deferred.resolve(data);
        }
    }

    return deferred.promise;
};

이게 도움이 됐으면 좋겠다.

언급URL : https://stackoverflow.com/questions/24794434/immediately-return-a-resolved-promise-using-angularjs

반응형