同步服务的异步响应到控制器变量

时间:2017-11-28 16:35:30

标签: angularjs angular-promise angularjs-service

我很难使用promises并在服务和控制器之间传递信息。

下面的代码功能,因为它进行调用,我得到了承诺,我对它们执行工作等等。我想现在将状态消息传回控制器,但我无法想出返回他们到控制器。

如何将myService的非承诺响应与我的控制器变量同步?或者我应该将$q.all承诺返回给控制器,然后让控制器调用statusService

理想情况下,我希望控制器只是“发射并忘记”并等待状态响应,以便我可以更新模态。

控制器

function doWork() {
  myService.doSomeWork();

  // what I'm going for:
  // var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}

服务

factory.doSomeWork = function() {        
  var promises = [
    queryApi("firstApiCall"), 
    queryApi("secondApiCall")
  ];

  $q.all(promises)
    .then(function(res) {
      workService.doSomething(res[0].data, res[1].data);
      console.log("response:", res);
      // I want to return a string, or object, back to a variable in my controller
      //return statusService.getStatusMessage(res[0]);
    }, function(err) {
      console.log("error:", err);
      //return statusService.getStatusMessage(err);
    }
  );      
};

function queryApi(url) {
  return $http.get(url);
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

在AngularJS中,异步服务应该是return的承诺。要转换服务中的promise数据,请确保将转换后的数据return转换为.then方法处理函数:

factory.doSomeWork = function() {        
  var promises = [
    queryApi("firstApiCall"), 
    queryApi("secondApiCall")
  ];

   ̲r̲e̲t̲u̲r̲n̲ $q.all(promises)
    .then(function successHandler(res) {
      workService.doSomething(res[0].data, res[1].data);
      console.log("response:", res);
      // I want to return a string, or object, back to a variable in my controller
       ̲r̲e̲t̲u̲r̲n̲ transformedData;
    }, function rejectionHandler(err) {
      console.log("error:", err);
       ̶/̶/̶r̶e̶t̶u̶r̶n̶ ̶s̶t̶a̶t̶u̶s̶S̶e̶r̶v̶i̶c̶e̶.̶g̶e̶t̶S̶t̶a̶t̶u̶s̶M̶e̶s̶s̶a̶g̶e̶(̶e̶r̶r̶)̶;̶
       ̲t̲h̲r̲o̲w̲ statusService.getStatusMessage(err);
    }
  );      
};

在拒绝处理程序中使用throw statement非常重要。否则,被拒绝的承诺将转换成为成功的承诺。

在控制器中:

function doWork() {
  var promise = myService.doSomeWork();

  promise.then(function(transformedData) {
      console.log(transformedData);
  }).catch(function(err) {
      console.log(err);
  });

  // what I'm going for:
  // var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}

有关详细信息,请参阅You're Missing the Point of Promises

答案 1 :(得分:0)

您可以通过

等服务进行回调
  factory.doSomeWork = function(callback) {        
 var promises = [
   queryApi("firstApiCall"), 
   queryApi("secondApiCall")
];

 $q.all(promises)
   .then(function(res) {
  //do a callback

  callback(res)

   }, function(err) {
       console.log("error:", err);

   }
  );      
};

并在您的控制器中,您可以收到结果

  function doWork() {
  myService.doSomeWork(function(result){
 //handle the result
});

}