2015-08-13 35 views
0

HTTP(RESTFUL的WebAPI)我有以下的控制器代碼適當的方式來調用angularjs

module.registerController('DemoCtrl', function ($scope, myFactory) { 
     myFactory.get(function (data) { 
      console.log(data); /// data is always undefined 
     }); 
    }); 

和工廠被調用REST風格的WebAPI

module.registerFactory('myFactory', ['$http', 
    function ($http) { 
      function get(callback) { 
       $http.get('mywebapiurl') 
        .success(function (response) { 
         //debugger; data comes back from server 
         callback(response); 
        }).error(function (response, status, headers, config) { 
         callback(response); 
        }); 
      } 

     return { 
      get: get 
     } 
    }]); 

工廠調用的WebAPI服務並執行以下取回數據。但是在控制器中,數據不會返回。

我在這裏錯過了一些明顯的東西嗎?也不知道這是否是在控制器中使用工廠在angularjs中調用webservice的最佳方式。任何投入都是最受歡迎的。

感謝,

+0

嘗試myFactory.get(),然後(函數(數據){}) –

回答

1

你想返回一個promise而不是傳遞迴調。由於$http.get已經返回一個承諾,您可以返回該承諾,或者直接返回響應數據的派生承諾。順便說一句,你factory看起來像它應該是一個service代替:

angular.moudule('yourApp') 
.service('myService', ['$http', myService]); 

function myService($http) { 
    this.get = function(url) { 
     return $http.get(url) 
        .then(function transformData(response){ 
         return response.data; 
        }).catch(function onError(rejectionResponse){ 
         //Whatever you want to do here 
        }); 
    } 
} 

這樣myService.get將返回你想要什麼承諾,你可以.then().catch().finally(),住在編碼風格的框架。例如:

var squirrels = []; 
myService.get('http://squirrelshop.com/api/squirrels') 
    .then(function(squirrelsData){ 
     console.log('Got the squirrels!'); 

     squirrels = squirrelsData; 
    }).catch(function(rejection){ 
     console.warn('Couldnt fetch squirrels. Reason: ' + rejection); 
    }); 
+0

感謝諾言確實似乎是一個更好的方法。您能否使用諾言發佈示例代碼?我對使用回調也有點不安。謝謝 – daehaai

+1

@activebiz我做到了。我建議對promises和它們的語法進行一些研究,它們非常優雅,但是解釋如何完全實現這一點對於SO回答來說有點過於寬泛;-) – LionC

1

控制器代碼

module.registerController('DemoCtrl', function ($scope, myFactory) { 
    myFactory.get("url").then(function(d) { 
      console.log(d.data); 
     } 
    }); 
}); 

工廠,呼喚寧靜的WebAPI

module.registerFactory('myFactory', ['$http', 
function ($http) { 
     var apiFactory = { 
       get:function(url){ 
        return $http.get(url); 
       } 
     } 
    return apiFactory; 
}]); 

成功和失敗在工廠

module.registerFactory('myFactory', ['$http', 
function ($http) { 
    var apiFactory = { 
      get:function(url){ 
       return $http.get(url).then(function(response){ 
         // success 
         return responce.data; 
       },function(error){ 
         //failure 
         return error; 
       }; 
      } 
    } 
    return apiFactory; 
}]); 
+0

是否有可能保持在工廠的成功和失敗的代碼? – daehaai

+1

是的,它的可能性,讓我在我的答案中加入這個。 –

相關問題