Immediately return a resolved promise using AngularJS

后端 未结 5 1099
故里飘歌
故里飘歌 2020-12-10 00:57

I\'m trying to get my head around promises in JavaScript (in particular AngularJS).

I have a function in a service, let\'s call it fooService, that chec

相关标签:
5条回答
  • 2020-12-10 01:19

    You could use the $q.defer() like this:

    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;
    };
    

    Hope this helps.

    0 讨论(0)
  • 2020-12-10 01:23

    As your promise use the same syntax as the JavaScript native one, you could use and return an already resolved JavaScript promise : Promise.resolve()

    return(Promise.resolve("MyReturnValue"));
    
    0 讨论(0)
  • 2020-12-10 01:28

    Similar to Elo's answer, you can return an already resolved promise using the async/await syntax:

    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();
    }
    
    0 讨论(0)
  • 2020-12-10 01:30

    The current accepted answer is overly complicated, and abuses the deferred anti pattern. Here is a simpler approach:

    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 
        });
    };
    

    Or, even further:

    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;
    };
    
    0 讨论(0)
  • 2020-12-10 01:30

    AngularJS's $q service will help you here. It is much like Kris Kowal's Q promise library.

    When you have an async method that may return a promise or value use the $q.when method. It will take what ever is passed to it, be it a promise or a value and create a promise that will be resolved/rejected based on the promise passed, or resolved if a value is passed.

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

    and then in your update function return the data instead of just returning

    if (data_loaded) return data_loaded;
    
    0 讨论(0)
提交回复
热议问题