2016-09-21 3 views
0

У меня есть проблемы со следующей цепочкой обещаний:Promise не возвращает правильный объект

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

вы не можете просто использовать 'userdata.isnewuser'? Кажется, у вас уже есть собственность, которую вы ищете в следующем обещании. –

+0

Да, я могу, конечно, но это не правильное решение ... проблема в том, почему «return bool» не возвращает то, что должно быть сделано – ai20

+0

Я считаю, что это имеет какое-то отношение к 'Parse.Cloud.run' ' реализация обещаний. Стандартный HTML Promise будет работать так, как вы ожидаете, но вы просто вводите функции в 'Parse.Cloud.run', который, вероятно, имеет свою собственную реализацию Promise, а не Vanilla HTML Promise. –

ответ

0

в соответствии с документацией - then(successCallback, [errorCallback], [notifyCallback]) - независимо от того, когда обещание было или будет разрешено или отклонено, а также асинхронно вызывает один из успешных или ошибочных обратных вызовов, как только результат будет доступен. Обратные вызовы вызываются с помощью одного аргумента: причина или отклонение. Кроме того, обратный вызов уведомления может быть вызван ноль или более раз, чтобы обеспечить индикацию выполнения, прежде чем обещание будет разрешено или отклонено.

так, вместо того, чтобы возвращаемое значение then принимает возвращаемый объект, который вызвал success: function (userdata), который userdata

+0

, если вы хотите, чтобы несколько обратных вызовов использовали 'then' вместо' success' –

0

успеха является функцией обратного вызова возвращаемого значения не будет переходить к следующему тогда. если вы хотите передать значение bool для следующего, нужно переписать код, как показано ниже.

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; 
} 

написать эту функцию в классе обслуживания и вызвать его из контроллера

+0

Это может стать хорошим ответом, если вы объясните что вы изменили в коде и почему. – Bergi

+0

Избегайте [отложенного антипаттера] (http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

Итак, если мы сможем создать класс обслуживания, мы можем позвонить, когда захотим в принципе, это угловой js workflow.service класс взаимодействует с кодом сервера –

Смежные вопросы