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

Sync Service's Async-Response to Controller Variable

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

下面的代码起作用,因为它进行调用,我得到承诺,我对它们执行工作等。我现在想将状态消息传递回控制器,但我无法弄清楚到 return 他们到控制器。

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

理想情况下,我希望控制器只是 "fire and forget" 并等待状态响应,以便我可以更新模态。

控制器

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);
}

如有任何帮助,我们将不胜感激。

您可以像

这样的服务进行回调
  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
});

}

在AngularJS中,异步服务应该return a promise. To transform promise data in a service, be sure to 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