2016-12-04 12 views
1

関数を返すサービスを作成していますが、関数から値が返されません。コードは次のとおりです。angularjsアプリケーションの非同期関数

function getUser() { 
    var Users = $resource('/api/users',{},{query: {method: 'get', isArray: true}}); 
    return Users.query({username:localStorage.getItem("token")}).$promise 
} 

function userrole() { 
    var userrole=''; 

    var tmp=getUser(); 
    tmp.then(function(user){ 
     var userrole= user[0].role; 
     console.log('The role is '+user[0].role); 
     userrole=user[0].role; 
     return userrole; 
    }); 
    console.log('@ the end of userrole'); 
} 

返されない関数はuserroleです。私はそれが非同期の問題のためだと信じています。これを解決するにはどうすればいいですか?

+0

あなたは、コンソールには何を見ていますか? – GMaiolo

答えて

1

AngularJS(およびすべてのJavascript)で非同期メソッドを使用する場合は、上記の関数で常に使用する必要があります。例えば

は:

function getUser() { 
    var token = localStorage.getItem('token'); 

    var Users = $resource('/api/users', {}, { 
    query: {method: 'get', isArray: true} 
    }); 


    return Users.query({username: token}).$promise; 
} 

function getUserRole() { 
    return $q(function(resolve, reject) { 
    getUser() 
     .then(function(user){ 
     resolve(user[0].role); 
     }) 
     .catch(reject); 
    }); 
} 

getUserRole().then(function (userRole) { 
    console.log('The role is ' + userRole); 
}); 
+0

[$ q](https://docs.angularjs.org/api/ng/service/$q)はAngularJSのPromiseのシンプルなアナログです –

+2

getUserは明らかにすでに約束を返しています。 ? – danh

+0

@danh。getUserはユーザーデータを返します。getUserRoleはユーザーの応答を処理し、ユーザーの役割を返します。getUserRoleにハンドラーを追加して使用できます。 –

1

あなたが達成しようとしていることがわかりませんが、 return tmp.then(...を返すと、他の場所からuserrole().then((role) => ...)に電話することができます。それ以外にあなたの圧痕を修正する。

+1

この答えが意味するのは、非同期関数がユーザーロールを返すことができないということです。ユーザーロールを取得することを約束する必要があります。 – danh

+0

@ダン10倍、どのように地球上でデータを操作できますか –

+0

@julianaMoralesクエリからデータを操作するとどういう意味ですか?約束が成功すれば(要求のように)、 '.then((dataReturnedFromPromise)=>'を呼び出すことができます)それだけです。 '.then'コールバックを連鎖すると、次の' then'関数は返されたものを返します前の '.then'コールバック –

関連する問題