28

私は、JavaScript (特に AngularJS) の約束について頭を悩ませようとしています。

私はサービスに関数を持っています。それを呼び出しましょうfooService。これは、データをロードしたかどうかをチェックします。もしそうなら、私はそれを返したいだけです.そうでない場合は、データをロードしてpromiseを返す必要があります:

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 呼び出しからデータを取得する必要がない場合、解決されたプロミスを関数からすぐに返したいですか?

4

5 に答える 5

50

promise は JavaScript ネイティブのものと同じ構文を使用するため、既に解決された JavaScript promise を使用して返すことができます: Promise.resolve()

return(Promise.resolve("MyReturnValue"));
于 2015-07-09T08:56:00.243 に答える
6

ここでは、 AngularJS の$qサービスが役に立ちます。これは、 Kris Kowal の Q promise ライブラリによく似ています。

promise または値を返す可能性のある非同期メソッドがある場合は、$q.whenメソッドを使用します。promise であれ値であれ、渡されたものは何でも受け取り、渡された promise に基づいて解決/拒否されるか、値が渡された場合に解決される promise を作成します。

$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;
于 2014-07-17T03:39:35.943 に答える
-2

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

お役に立てれば。

于 2014-07-17T03:37:49.627 に答える