在angularjs中运行同步的工厂方法

时间:2017-07-03 12:45:03

标签: angularjs asynchronous factory

我是angularjs世界的新手,我试图了解如何在angularjs同步中运行整个factry方法。

    factory.factory("Connections", function($rootScope, $http, $q) {
     var deferred = $q.defer();
     var connectionStatus;
     console.log("start of factory.factory function");
     $http.get('http://localhost:8088/ecus').success(function(response) {
             deferred.resolve(response);
             console.log(" connection status: " + response.status);
             connectionStatus = 'available';
         })
         .error(function(errResponse) {
             deferred.reject({
                 message: "No connection"
             });
             //   return deferred.promise;
             connectionStatus = 'not available';
             console.log(connectionStatus);
         });
     console.log("end of the factory.factory function");
     return [{
         id: 'conID1',
         pathToImage: 'images/default_test   /eBikeImages/Bionx_creme.png',
         title: 'connection 1',
         status: connectionStatus,
         visible: true,
         favorite: true
     }];
 });

这个想法是从URL调用中获取connectionStatus的值,并在返回值中使用它,这是JSON对象。 问题是正在调用工厂但是没有分配connectionsStatus的值,并且返回了带有connectionStatus的未定义值的Json。 在控制台中,我看到"工厂开始的日志"和"工厂结束"在http调用之前正在执行! 任何帮助将不胜感激:))

3 个答案:

答案 0 :(得分:0)

您已经在使用promise服务,这将帮助您异步运行函数。

只需返回$ http服务功能。这本身就是回报承诺。

这是我要做的,

    factory.factory("Connections", function($rootScope, $http, $q) {

       var deferred = $q.defer();
      var connectionStatus;
      console.log("start of factory.factory function");
             $http.get('http://localhost:8088/ecus').success(function(response) {
             console.log(" connection status: " + response.status);
             connectionStatus = 'available';

            deferred.resolve({
                 id: 'conID1',
                 pathToImage: 'images/default_test   /eBikeImages/Bionx_creme.png',
                 title: 'connection 1',
                 status: connectionStatus,
                 visible: true,
                 favorite: true
             });
     }).error(function(errResponse) {
       connectionStatus = 'not available';
       console.log(connectionStatus);
       deferred.reject({
            message: "No connection",
            status: connectionStatus,
       });
 });
  console.log("end of the factory.factory function");
  return deferred.promise;
});

工厂的来电者将通过.then功能

读取您的值

答案 1 :(得分:0)

你想把它作为同步运行,但是你要完成异步执行的依赖(即这里的ajax调用),所以你可以尝试的事情:

1> 返回一个承诺,并在您执行调用后解析该承诺并填充数据并使用数据解析,并在注入结束时使用.then(function(data){...})并将回调传递给获取数据。或者你可以返回$ http直接返回的承诺。但是,由于您正在编写单独的服务,因此最好返回您感兴趣的数据。

2> es2017的异步和等待(新功能,到目前为止可能无法支持)

3> (不推荐,会阻止浏览器一段时间)编写自己的代码,使用XmlHttpRequest进行同步ajax调用,因为使用$ http没有可配置的选项可以这一点。

4> 或者,返回引用,并在从服务器获得响应时填充该内部对象,并广播一些有意义的事件,如Connections.ready。 (它不是通用解决方案,但会解决您的问题,因为您在服务中使用角度并注入$rootScope。)

享受编码和异步执行处理:)

答案 2 :(得分:0)

请参阅更新的代码,只需构建新的回复

[HttpGet]
public JsonResult GetColorByCode(string value)
{       
    var resultValue = Server.UrlDecode(value);
    return Json(new { data = resultValue, isSuccess = true}, JsonRequestBehavior.AllowGet);                         
}

在控制器中你会写

factory.factory("Connections", function($rootScope, $http, $q) {
     var deferred = $q.defer();
     var connectionStatus;
     console.log("start of factory.factory function");
     $http.get('http://localhost:8088/ecus').success(function(response) {
            var newResponse = {
                'response': response,
                'connectionStatus': 'available'
            };
             deferred.resolve(newResponse);
             console.log(" connection status: " + response.status);
             connectionStatus = 'available';
         })
         .error(function(errResponse) {
            var newResponse = {
                'response': errResponse,
                'connectionStatus': 'not available'
            };

             deferred.reject(newResponse);
             connectionStatus = 'not available';
             console.log(connectionStatus);
         });
     console.log("end of the factory.factory function");
     return [{
         id: 'conID1',
         pathToImage: 'images/default_test   /eBikeImages/Bionx_creme.png',
         title: 'connection 1',
         status: connectionStatus,
         visible: true,
         favorite: true
     }];
 });