2016-02-17 2 views
0

У меня есть эта функция:

// Gets our sport 
get: function (slug, kit) { 

    // If we have no slug, exit the function 
    if (!slug) 
     return $q.reject('No slug supplied.'); 

    // Try to get our sport 
    return moltin.categories.get(slug).then(function (response) { 

     // If we have a kit 
     if (kit) { 

      // Assign our sport to our kit 
      kit.team.sport = response.slug; 
     } 

     // Return our response 
     return response; 
    }); 
} 

Как вы можете видеть, я использую $ q.reject() если мой обязательный параметр не установлен , Проблема заключается в том, в состояние метода разрешения $, если я вызвать функцию так:

resolve: { 

    sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParmas, kit, sharedSport) { 

     // Get our slug 
     var slug = $stateParmas.sport || kit.team.sport; 

     // Get our sport 
     return sharedSport.get(slug, kit); 
    }] 
} 

мой взгляд, не будет отображаться (это просто пустой). Но если я изменю свое решение по этому вопросу:

resolve: { 

    sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParmas, kit, sharedSport) { 

     // Get our slug 
     var slug = $stateParmas.sport || kit.team.sport; 

     // Get our sport 
     return sharedSport.get(slug, kit).then(function (response) { 
      return response; 
     }, function (error) { 
      return null; 
     }); 
    }], 

    pageTitle: ['PageHead', function (service) { 
     service.setTitle('Kudos Sports - Create your kit'); 
    }] 
} 

это работает. Я не хочу указывать метод успеха и неудачи. В любом случае, я могу обойти это?

ответ

2

Решения ждут обещания, чтобы решить проблему до загрузки страницы. В вашем коде есть несколько проблем, которые я помогу вам определить и решить, однако я настоятельно рекомендую вам принять this short course on Udacity и освежить ваше понимание обещаний.

Во-первых, нам нужно реорганизовать метод get, чтобы вернуть обещание после того, как ваши данные будут разрешены.

// Gets our sport 
get: function (slug, kit) { 
    var deferred = $q.defer(); 

    // If we have no slug, exit the function 
    if (!slug) 
    deferred.reject('No slug supplied.'); 

    // Try to get our sport 
    moltin.categories.get(slug).then(function (response) { 

    // If we have a kit 
    if (kit) { 

     // Assign our sport to our kit 
     kit.team.sport = response.slug; 
    } 

    // Return our response 
    deferred.resolve(response); 
    }); 

    return deferred.promise; 
} 

Как вы можете видеть, вы не можете просто вернуть данные в обещание. Вы должны создать другое обещание и вернуть его, как только будут данные.

Следующим шагом является использование этой функции в пределах разрешения. Вы, кажется, использовали $stateParmas вместо $stateParams, поэтому мы исправим это. Кроме того, это плохая практика, чтобы назвать ваши услуги по-разному в разных местах. Сохранение совместимости с соглашениями об именах упрощает отладку.

resolve: { 

    sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParams, kit, SimpleDesignerSharedSportService) { 

    // Get our slug 
    var slug = $stateParams.sport || kit.team.sport; 

    // Get our sport 
    return SimpleDesignerSharedSportService.get(slug, kit); 
    }] 
} 

Теперь метод Get возвращает обещание, устраняющее только один раз есть ответ от выборки категорий, и вы еще раз контроль потока данных.

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