2016-02-17 62 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方法返回一個承諾,只有一次有來自獲取類別的響應,你再次擁有的數據流的控制解決。