2016-11-23 9 views
1

私の問題は、約束が解決されるのを待っているということです。 コンソールからの検査でわかるように、プロバイダとスキルオブジェクトを取得できなかったことが表示され、その約束が返されます。角度は解決する約束を待たずに

は、私の意見では最も関連性の高いコード部分です。私は角度ライブラリー - $ qを使ってサービスを作って、下のサービスで見ることができるように、延期された、そして、いつオプションを使用しました。

プロバイダサービス:

this.getProviderById = function (providersId) { 
     // will hold backend provider of the provider with id = providersId 
     var provider = undefined; 
     // if provider object is not defined then start the new process to fetch it 
     if (!provider) { 
      // create deferred object using $q 
      var deferred = $q.defer(); 

      // get provider form backend 
      $http.get('http://localhost:3000/providers/getbyid/' + providersId) 
       .then(function (result) { 
        console.log('provider by id result - ' + JSON.stringify(result.data)); 
        // save fetched provider to the local variable 
        provider = result.data; 
        // resolve the deferred 
        deferred.resolve(provider); 
       }, function (error) { 
        providers = error; 
        deferred.reject(error); 
       }); 

      // set the provider object to be a promise until result comeback 
      provider = deferred.promise; 
     } 
     return $q.when(provider); 
    }; 

プロバイダのコントローラーの定義:

var vm = this; 
    vm.getCurrentUser = getCurrentUser; 
    function getCurrentUser(){ 
     console.log('returning current user from auth service'); 
     return authService.getCurrentUser(); 
    } 
    vm.getProviderById = getProviderById; 
    function getProviderById(providersId){ 
     providerService.getProviderById(providersId) 
      .then(function onSuccess(providerResult){ 
       console.log('providerResult - ' + JSON.stringify(providerResult)); 
       $scope.provider = providerResult; 
      }, function onError(error){ 
       console.log('error getting provider by id - ' + error); 
      }); 
    } 

    vm.getProviderSkills = getProviderSkills; 
    function getProviderSkills(providersId){ 
     providerService.getProvidersSkills(providersId).then(function onSuccess(resultSkills){ 
      console.log('resultSkills - ' + JSON.stringify(resultSkills)); 
      $scope.skills = resultSkills; 
     }, function onError(error){ 
      console.log('error getting providers - ' + $scope.provider + ' - skills'); 
     }); 
    } 

プロバイダのコントローラの使用状況:

$scope.user = vm.getCurrentUser(); 
    if ($scope.user !== null && $scope.user !== undefined) { 
     console.log('user - ' + JSON.stringify($scope.user)); 
    } else { 
     vm.initUsersProvider(); 
     console.log('initiated users provider'); 
    } 
    vm.getProviderById($scope.user.provider); 
    if ($scope.provider !== null && $scope.provider !== undefined) { 
     console.log('provider - ' + JSON.stringify($scope.provider)); 
    } else { 
     console.log('didnt get provider object'); 
    } 
    vm.getProviderSkills($scope.provider); 
    if ($scope.skills !== null && $scope.skills !== undefined) { 
     console.log('provider - ' + JSON.stringify($scope.skills)); 
    } else { 
     console.log('didnt get skills object'); 
    } 

上の写真のコンソール表示結果を点検:

user - {"_id":"5835b06b975ace23244bf205","email":"[email protected]","password":"","fbuser":"5835b06a975ace23244bf204","provider":"5835b06f975ace23244bf206","admin":false,"__v":0} 
ProviderRegisterController.js:14 providersId - 5835b06f975ace23244bf206 
providerService.js:74 providersId - 5835b06f975ace23244bf206 
ProviderRegisterController.js:110 didnt get provider object 
ProviderRegisterController.js:117 didnt get skills object 
ProviderRegisterController.js:122 no availability module found 
ProviderRegisterController.js:124 no bio module found 
providerService.js:83 provider by id result - {"_id":"5835b06f975ace23244bf206","bio":"","__v":2,"references":[],"availability":{"auto":true},"skills":["5835b220975ace23244bf208","5835b2ff975ace23244bf209"]} 
ProviderRegisterController.js:17 providerResult - {"_id":"5835b06f975ace23244bf206","bio":"","__v":2,"references":[],"availability":{"auto":true},"skills":["5835b220975ace23244bf208","5835b2ff975ace23244bf209"]} 
providerService.js:56 received skills from db - [object Object],[object Object] 
ProviderRegisterController.js:27 resultSkills - [{"_id":"5835b220975ace23244bf208","topic":2,"description":"sdfsdf","price":45,"status":"PENDING","__v":0},{"_id":"5835b2ff975ace23244bf209","topic":1,"description":"ddfgdfg","price":45,"status":"PENDING","__v":0}] 

おかげで、すべての助け:)

+0

これは、約束事が働く方法です:角度は約束を待たずに、 '.then()'コールバックの中で解決された約束を必要とするコードを入れなければなりません。 'vm.getProviderById()'のようなメソッドを使用している約束を返し、 '$ scope.provider'にアクセスするコードを' .then() 'に移動します。 – Duncan

+0

getProviderByIdの関数定義を見ると、実装はhttp要求を行い、 '" return $ qを返すproviderServiceを呼び出します。(プロバイダ); "それはサービスの呼び出し後に処理されます。成功すると$スコーププロバイダは応答があるように設定されていますので、私はあなたの答えを理解していません –

答えて

2

のための問題は、機能vm.getProviderByIdvm.getProviderSkillsを呼び出したとき、彼らは、自分たちにはないが、これらの機能を約束を返す他の関数を呼び出すことです。したがって、彼らは呼び出され、次のステップに移ります。

これらの機能が実際にお互いに依存している場合は、約束をまとめたり、それぞれの約束のそれぞれのsuccessの中から呼び出す必要があります。プロバイダのコントローラの使用状況で

+0

それはあなたができるなら助けてくださいvm.getProviderByIdを定義して、http要求を行うサービス関数を呼び出すように定義し、呼び出し後に応答を処理する成功例があるため、コードスニペットを記述してください –

0

$scope.user = vm.getCurrentUser(); 
if ($scope.user !== null && $scope.user !== undefined) { 
    console.log('user - ' + JSON.stringify($scope.user)); 
} else { 
    vm.initUsersProvider(); 
    console.log('initiated users provider'); 
} 
vm.getProviderById($scope.user.provider); 
if ($scope.provider !== null && $scope.provider !== undefined) { 
    console.log('provider - ' + JSON.stringify($scope.provider)); 
} else { 
    console.log('didnt get provider object'); 
} 
vm.getProviderSkills($scope.provider); 
if ($scope.skills !== null && $scope.skills !== undefined) { 
    console.log('provider - ' + JSON.stringify($scope.skills)); 
} else { 
    console.log('didnt get skills object'); 
} 

vm.getProviderId()戻りの呼び出し、あなたは、特定のことができる唯一のことは、vm.getProviderId().then()コードのいずれもまだ呼び出されていないということです。しかし、$scope.providerにアクセスしようとすると、設定されません。

getProviderIdは、完了したことを示すためにプロミスを返さなければなりません。必要に応じて約束をproviderで解決することもできます(これはおそらくここのスコープに割り当てるよりも良いでしょう)。

getProviderSkills()を同様の方法で変更して最終的な約束を返すこともできます。

今、あなたはこのようにそれを使用する:あなたは()の$ q.rejectを返すことによって、あなたはシーケンスの残りを中止し、処理するために、最後に単一の場所を持っていることを/ログイン

vm.getProviderById($scope.user.provider) 
.then(function(provider) { 
    $scope.provider = provider; // If you still need to save it in scope. 
    if (provider !== null && provider !== undefined) { 
     console.log('provider - ' + JSON.stringify(provider)); 
    } else { 
     return $q.reject('didnt get provider object'); 
    } 
    return vm.getProviderSkills(provider); 
}) 
.then(function(skills) { 
    if (skills === null || skills === undefined) { 
     return $q.reject('didn\'t get skills object'); 
    } 
    $scope.skills = skills; 
}, 
function failureCallback(error) { 
    console.log(error); 
}); 

注意エラー。

関連する問題