2014-10-26 2 views
1

Im пытается заблокировать пользователя от перехода на какой-то маршрут, если у него нет способа оплаты. это код:

 resolve: { 
      hasPayment: ['userService', 'paymentsService','$q', function(userService,paymentsService, $q) { 
      if(userService.oAuth) { 
       paymentsService.getPayments().then(function(res) { 
        if(res.data.data.length) return $q.reject({hasPayment:true}); 
        }); 
       } 
       }] 
      } 

$rootScope.$on('$stateChangeError', function(event, toState,toParams, fromState, fromParams, error) { 
      console.log(error); 
    }); 

но его ошибка не возникает, если условие истинно, почему?

+0

Вы не хотите отказаться, когда длина == 0, а? Кроме того, вы не возвращаете обещание. Таким образом, функция всегда возвращалась неопределенно. Это должно быть 'return paymentsService.getPayments() ...'. –

+0

Нет то есть для маршрута, что он добавляет способ оплаты – Bazinga

ответ

3

Вам нужно вернуть обещание, которое будет отклонено, используя $ q.reject, вы просто создаете новый отложенный и отклоняете его, но «разрешение» не будет ждать ответа, потому что оно не знает об этом.

Лучше всего сделать было бы отклонить обещание непосредственно в paymentsService.getPayments(), тогда ваш код будет выглядеть следующим образом:

resolve: { 
     hasPayment: ['userService', 'paymentsService','$q', function(userService,paymentsService, $q) { 
      return paymentsService.getPayments(); 
      }] 
     } 

Если вы не можете сделать это по какой-то причине, просто создать новое обещание и отклонить его, некоторые, как это:

resolve: { 
     hasPayment: ['userService', 'paymentsService','$q', function(userService,paymentsService, $q) { 
     var deferred = $q.defer(); 

     if(userService.oAuth) { 
      paymentsService.getPayments().then(function(res) { 
       if(res.data.data.length) { 
        deferred.reject({hasPayment:false}); 
       } else { 
        deferred.resolve(); 
       } 
       }); 
     } else { 
      deferred.resolve(); 
     } 

     return deferred.promise; 
     }] 
    } 
+0

Спасибо! это работает – Bazinga

+0

@Asaf David и anguLaravel, см. мой ответ ниже для улучшения этого ответа. –

0

Я хотел прокомментировать решение Асафа Давида, но нужен блок кода, чтобы продемонстрировать, таким образом разместить в качестве ответа (если есть лучший механизм, пожалуйста дайте мне знать)

Поскольку окончательный результат обещания является результатом цепочки обещаний , возвращаемых, вы можете просто цепью .then() и вернуть соответствующее значение изнутри. Ответ Асаф можно записать гораздо проще без использования «отложенное антишаблоном» (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns):

resolve: { 
     hasPayment: ['userService', 'paymentsService','$q', function(userService,paymentsService, $q) { 
     if(userService.oAuth) { 
      return paymentsService.getPayments().then(function(res) { 
       if (res.data.data.length) 
        return $q.reject({hasPayment: false}); // hasPayment is rejected. 
       // since you seem to be using hasPayment as a pass/fail you could even 
       // get by without returning anything here, but return true to be explicit. 
       return true; 
      } 
     } 
     }] 
    } 
+0

Это правда, но вы забыли обработать случай elseService.oAuth –

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