2016-09-21 10 views
0

権利オブジェクトを返しません:約束は、私は約束の以下のチェーンに問題がある

Parse.Cloud.run('cloudlogin', { 
     fb_accessToken: $localStorage.accessTokenFacebook 
     , facebookID: FACEBOOKID 
    }, { 
     success: function (userdata) { 
      alert(JSON.stringify(userdata)) 
      $localStorage.username = userdata.username; 
      $localStorage.password = userdata.password; 
      $localStorage.fb_access_token = userdata.fb_accessToken; 
      var bool = userdata.isnewuser 
      alert('bool' + bool) 
      return bool 
     } 
     , error: function (error) { 
      alert(error) 
      $state.go("login") 
       .then(function() { 
        $ionicLoading.hide() 
       }) 
     } 
    }) 
    .then(function (isnewuser) { 
     $localStorage.organizerAccess = true; 
     alert('fbdata' + JSON.stringify(isnewuser)) 
    }) 

私が代わりに第二約束だけにはブール「isnewuser」を返すように最初の約束をしたいと思います全体の 'userdata'オブジェクトが返されます。何か案が?

+0

からそれを呼び出しますか?次の約束の中であなたが探している物件を既に持っているようです。 –

+0

はい私は明らかにできますが、正しい解決策ではありません....問題は、 '返されたブール'が何をすべきかを返さない理由です。 – ai20

+0

これは 'Parse.Cloud.run'と何か関係がありますPromisesの実装標準のHTML Promiseは期待どおりに動作しますが、バニラHTML Promiseではなく、Promise独自の実装を持つ 'Parse.Cloud.run'に関数を入力するだけです。 –

答えて

0

ドキュメントには - then(successCallback, [errorCallback], [notifyCallback])と表示されていますが、約束がいつ解決されるか、拒否されるかどうかに関係なく、結果が利用可能になるとすぐに、成功またはエラーのコールバックを非同期に呼び出します。コールバックは、単一の引数、つまり結果または拒否の理由で呼び出されます。さらに、通知コールバックは、約束が解決または拒否される前に、進行通知を提供するために0回以上呼び出されることがあります。

ので、返された値thenを取る代わりに、オブジェクトがuserdata

+0

複数のコールバックで 'success'の代わりに' then'を使用する場合 –

0

成功は、その戻り値は、次のに渡さないコールバック関数ですsuccess: function (userdata)の原因となった返されます。ブール値を次の値に渡したい場合は、以下のようなコードを書き直す必要があります。

Parse.Cloud.run('cloudlogin', { 
     fb_accessToken: $localStorage.accessTokenFacebook 
     , facebookID: FACEBOOKID 
    }, { 
     error: function (error) { 
      alert(error) 
      $state.go("login") 
       .then(function() { 
        $ionicLoading.hide() 
       }) 
     } 
    }).then(function (userdata) { 
      alert(JSON.stringify(userdata)) 
      $localStorage.username = userdata.username; 
      $localStorage.password = userdata.password; 
      $localStorage.fb_access_token = userdata.fb_accessToken; 
      var bool = userdata.isnewuser 
      alert('bool' + bool) 
      return bool 
     }) 
    .then(function (isnewuser) { 
     $localStorage.organizerAccess = true; 
     alert('fbdata' + JSON.stringify(isnewuser)) 
    }) 
+0

'error'コールバックを避け、' onrejected'パラメータとして 'then'に渡すべきでしょう。 – Bergi

0
login: function() { 

    var deferred = $q.defer(); 

    Parse.Cloud.run('cloudlogin', { 
     fb_accessToken: $localStorage.accessTokenFacebook, 
     facebookID: FACEBOOKID 
    }).error(function (error) { 
     alert(error) 
     $state.go("login") 
     .then(function() { 
      $ionicLoading.hide() 
     }) 
    }) 
    .then(function (userdata) { 
     alert(JSON.stringify(userdata)) 
     $localStorage.username = userdata.username; 
     $localStorage.password = userdata.password; 
     $localStorage.fb_access_token = userdata.fb_accessToken; 
     deferred.resolve(userdata.isnewuser); 
    }); 

    return deferred.promise; 
} 

書き込みあなただけの `userdata.isnewuser`を使用することはできません。このサービスクラスの機能とコントローラ

+0

説明するとよいでしょうあなたがコード内で何を変えたのか、そしてその理由。 – Bergi

+0

[繰延反パターン](http://stackoverflow.com/q/23803743/1048572)を避けてください! – Bergi

+0

サービスクラスを作成できる場合は、基本的にこれが角度js workflow.serviceクラスがサーバーコードと対話したいときに呼び出すことができます –