2013-05-08 18 views
8

私はangularjsで$ http約束になると問題があります。私は私のサービスでこれをやっています:(getSomething関数は2つの約束を結ぶべきです)

2番目の関数は外部コールバック関数を使います!

 
app.service('blubb', function($http, $q) { 

    var self = this; 

    this.getSomething = function(uri, data) { 
    return self.getData(uri).then(function(data2) { 
     return self.compactData(uri, data2); 
    }); 
    }; 

    this.getData = function(uri) { 
    var deferred = $q.defer(); 
    $http.get(uri).success(function(data) { 
     deferred.resolve(data); 
    }).error(function() { 
     deferred.reject(); 
    }); 

    return deferred.promise; 
    }; 

    this.compactData = function(uri, data) { 
    var deferred = $q.defer(); 
    /* callback function */ 
     if(!err) { 
     console.log(compacted); 
     deferred.resolve(compacted); 
     } else { 
     console.log(err); 
     deferred.reject(err); 
     } 
    /* end of function */ 

    return deferred.promise; 
    }; 
}); 

私は私のコントローラでサービスを利用する場合、それは出力にconsole.logません:、 i「はcompactData」を自分でコールバック関数を定義した場合、それは動作します:

 
blubb.getSomething(uri, input).then(function(data) { 
    console.log(data) 
}); 

編集を私はhttps://raw.github.com/digitalbazaar/jsonld.js/master/js/jsonld.jsから "jsonld.compact"を使用していますが、これは機能しません!

 
    jsonld.compact(input, context, function(err, compacted) { 
     if(!err) { 
     console.log(compacted); 
     deferred.resolve(compacted); 
     } else { 
     deferred.reject('JSON-LD compacting'); 
     } 
    }); 

私はjsonld.compactではconsole.log出力を取得していますが、解決には動作しませんし、それだけで$ rootScopeで動作する理由..

私は知りません。$延期(適用されます.resolve(compacted));

+0

でそれを使用する; ''延期します.resolve( "compacted"); '、おそらくは' err'と同じです。 –

+0

sry、 'compacted'と' err'はコールバック関数で定義されています!この関数には 'console.log(compacted)'から正しい出力がありますが、 '連鎖' getSomething関数には出力されません。 –

+0

それでも動作しない場合は、 'blubb.getSomething()'をテストする前に、 'blubb.getData()'と 'blubb.compactData()'を別々にテストしてください。 –

答えて

1

チェーンの約束はここに動作します:あなたの実装でjsfiddle

$http.getまたはcompactDataconsole.log(data)を呼び出すことはありませんあなたのうまくいかない場合。

あなたは多分エラーをキャッチする必要があります:あなたが新しい順番/チックで実行外部(外部AngularJSへの)コールバックを使用するたびに

blubb.getSomething(uri, input).then(function(data) { 
     console.log(data);  
    }, function(err) { 
     console.log("err: " + err); 
    }); 
+0

私は理由を知らないが、エラーをログアウトしても出力がない。 しかし、私が '$ rootScope。$ apply'を使うとうまくいきますが、' Error:$ digest already in progress'を取得しています –

1

は、あなたが(適用$をコールする必要があります)、適切な範囲にした後、それが呼び出されました。これにより、AngularJSは更新する必要があることを知ることができます。すべての約束が解決された後で、あなたが一度だけそれを呼んでいることを確認したいと思うでしょう。さて、jsonld.jsは約束/将来のAPIを提供しています。すでに約束をしているのであれば、上記のラッパーコードを実行する必要はありません。代わりにあなたが行うことができます:私はこのような連鎖の約束を使用してい

var promisesApi = jsonld.promises(); 
var promise = promisesApi.compact(input, context); 

// do something with the promise 
5

  $http.get('urlToGo') 
       .then(function(result1) { 
        console.log(result1.data); 
        return $http.get('urlToGo'); 
       }).then(function(result2) { 
        console.log(result2.data); 
        return $http.get('urlToGo'); 
       }).then(function(result3) { 
        console.log(result3.data); 
       }); 
0

は私があなたの代わりにサービスの工場を使用することをお勧めします。

ただ、工場からの関数を返すと `compacted`がどこかで定義されており、スコープ内にある、あなたはおそらく` deferred.resolve(コンパクト化)を変更したい場合を除き、あなたのコントローラ

関連する問題