2

をあざけるを持つ:が、私はこの機能をモックとしたい難易Promise.all

function getMetaData(key) { 
     var deferred = $q.defer(); 
     var s3 = vm.initiateBucket(); 
     var params = { 
      Bucket: constants.BUCKET_NAME, 
      Key: key 
     }; 
     s3.headObject(params, function(error, data) { 
      if(error) { 
       deferred.reject(error); 
      } 
      else { 
       console.log(data); 
       deferred.resolve(data.Metadata); 
      } 
     }); 
     return deferred.promise; 
    }; 

私はこの機能をモックとしspyOnを使用しています:

spyOn(awsServices, 'getMetaData').and.callFake(function() { 
     console.log("MOCKED"); 
     return $q.resolve({ 
      key: "MOCKED_KEY", 
      description: "MOCK_DESCRIPTION", 
      views: 1 
     }); 
    }); 

をスパイが動作しているようです - "MOCKED" console.logが呼び出されています。ここでのgetMetaDataを呼び出す関数は次のとおりです。

function getPicsRadius(){ 
//Ommitted 
    var promises = []; 

    promises.push(awsServices.getMetaData(momentsInStates[i].Key) 
     .then(function(metaData) { 
     console.log(metaData); 
     return { 
      key: metaData.key, 
      description: metaData.description, 
      views: metaData.views 
     }; 
    })) 

} 
return promise.all(promises); 

これは約束のチェーンを使用して別の関数によって呼び出されます。

function getNearbyMoments() { 
    //omitted 
    return calculateNearbyStates() 
    .then(getPicsByState) 
    .then(concatPics) 
    .then(getPicsWithinRadius).then(function(){ 
     console.log("SHOULD LOG BUT IS NOT"); 
    }); 
} 

にconsole.log最後に印刷がありません。私が得ている唯一のエラーは、非同期タイムアウトエラーです。したがって、getMetaData(MOCKED) - > getPicsRadius - > getNearbyMoments(then関数には入りません)でなければなりません。私はこれがプロミスと何か関係があると思っています。私は定期的な約束を悩むことが決してないので、私が帰ってきています。どんな洞察?

+3

'getPicsRadius'関数で' promise.all'の代わりに '$ q.all'を使ってみましたか? –

+2

ES6の約束事は、AngularJSフレームワークとそのダイジェストサイクルと統合されていません。 AngularJSの実行コンテキストで適用される操作だけが、AngularJSのデータバインディング、例外処理、プロパティの監視などから利益を得ます。代わりに、[Promise.all]の場合は、[$ q.allメソッド](https:// docs。 angularjs.org/api/ng/service/$q#all)。 – georgeawg

+0

'getPicsRadius()'中の 'return promise.all(約束);の呼び出しを想定しています。この関数は単に質問のタイプミスですか? – Rhumborl

答えて

2

ES6の約束事はAngularJSフレームワークとそのダイジェストサイクルと統合されていません。

AngularJSは、独自のイベント処理ループを提供することによって、通常のJavaScriptフローを変更します。これにより、JavaScriptが古典的なAngularJS実行コンテキストに分割されます。 AngularJSの実行コンテキストで適用される操作のみが、AngularJSのデータバインディング、例外処理、プロパティの監視などの恩恵を受けます。

$q.all methodの代わりに、Promise.allを使用してください。

関連する問題