2015-11-25 51 views
1

好吧,這讓我很生氣,基本上我正在嘗試創建一個服務來獲取和評估用戶功能,我使用的是WP REST API。我使用restangular來獲取我的JSON數據。在angularJS中創建一個服務,使用restangular promises

在這個階段,我正在測試控制器本身的功能,但無論測試它在哪裏,無論是在我的自定義服務中使用this.method還是在控制器內部,使用或不使用$ scope,結果總是未定義。我知道我錯過了某些東西,或者我在函數內部返回true或false,或者當涉及到JS中的promise時,會有些根本性的不同。下面是代碼:

var current_user = parseInt(o2_i18n.user_id), 
     currentUserCapabilities, 
     capability; 

    $scope.currentUserCan = function(capability) { 
     if(current_user !== '0') { 
      wpAPIResource.one('users').get() 
      .then(function(allUsers){ 
       for (var i = 0; i < allUsers.length; i++) { 
        if (allUsers[i].id === current_user) { 
         var currentUserCapabilities = allUsers[i].capabilities; 
         for(var prop in currentUserCapabilities){ 
          if (capability === prop) { 
           //$log.log(prop); 
           return prop; 
          } else { 
           //$log.log(prop); 
           return false; 
          } 
         } 
        } 
       } 
      }, function(reason){ 
       $log.error(reason); 
      }); 
     } else { 
      //The user is not logged in, therefor no capabilities 
      return false; 
     } 
    }; 

    $log.log($scope.currentUserCan('publish_posts')); 

    if ($scope.currentUserCan('publish_posts')) { 
     $log.log('Yes I Can!'); 
    } else { 
     $log.warn('No Can\'t Do!'); 
    } 

回答

1

currentUserCan功能不一樣,如果current_user !== '0'返回任何東西。你應該有它返回一個承諾,例如(以下你需要注入$q服務)

$scope.currentUserCan = function(capability) { 
    if(current_user !== '0') { 
     // note the "return" here 
     return wpAPIResource.one('users').get().then(function(allUsers){ 
      for (var i = 0; i < allUsers.length; i++) { 
       if (allUsers[i].id === current_user) { 
        var currentUserCapabilities = allUsers[i].capabilities; 
        for(var prop in currentUserCapabilities){ 
         if (capability === prop) { 
          return prop; 
         } 
        } 
       } 
      } 
      return false; 
     }, function(reason){ 
      $log.error(reason); 
      return $q.reject(reason); // you still want the promise to fail 
     }); 
    } else { 
     return $q.resolve(false); 
     // this turns the static value into a promise so the API for this 
     // function is consistent 
    } 
}; 

然後消耗這樣

$scope.currentUserCan('publish_posts').then(function(can) { 
    if (can) { 
     $log.log('Yes I Can!'); 
    } else { 
     $log.warn("No Can't Do!"); 
    } 
}); 

功能我也清理稍微調整一下你的循環。在你的OP中,在內部循環中沒有任何意義,如果在allUsers陣列中找不到用戶,則沒有return值。

+0

謝謝菲爾,像一個魅力。 所以基本上我在這裏錯過的事實是,如果我要返回wpAPesource.one ...(我嘗試過),我的主範圍函數返回了一個承諾,我必須將其作爲承諾來處理,而不是我期望的返回真假值。所以要包裝起來,我必須研究更多的角度承諾,$ q服務,也許我需要刷新我對JS中函數式編程的知識。還有什麼我應該去的?與PHP相比,當作爲JS開發人員思考時,似乎存在更多差異。 –