使用 angular 服务链接 http.get 承诺

chaining http.get promises with angular service

这样做不好吗?我基本上是在链接承诺,其中每个成功的 return 来自服务器,启动一个新的 http.get() 以获取更多信息,但不是在它出错时。不再 http.get()s 如果它导致 errorCallback!

$http.get(...).then(function() {
  $http.get(...).then(function(){ 
      $http.get(...).then(function(){}, function(){}), 
   function(){}); }, 
mainErrorCallback);

如果它在

中 "ViewsService.loadViews()" 而不是 "$http.get()" 会有所不同吗
$http.get(...).then( function() { ViewsService.loadViews(); }, function(){ console.log("error"); }). 

编辑:这就是我的意思,同步..它似乎有效,但代码需要 cleanup/efficency 看起来更整洁:

http://jsfiddle.net/4n9fao9q/6/

(有延迟的 http 请求):http://jsfiddle.net/4n9fao9q/26

$http.get(...).then((res) => {
  //res has data from first http
  return $http.get(...);
}).then((res) => {
  //res has data from second http
  return $http.get(...);
}).then((res) => {
  //res has data from third http
}).catch((err) => {
  //exploded
});

我觉得比较干净。您可以将 $http.get 替换为任何功能 returns 的承诺。如果ViewsService.loadViews() returns一个promise,你可以使用它。

如评论中所问。

...
ViewsService.loadViews = function() {
  //returns a promise
  return $http.get(...);
}

OR

ViewsService.loadViews = function() {
  return new Promise((resolve, reject) => {
    $http.get(...).then((result) => {
      //whatever
      return resolve();
    })
  })
  return $http.get(...);
}

使用 loadViews 的任何选项,您可以执行 ViewsService.loadViers.then(等)

这样做不好吗?

  • 效率

除非您使用第一个请求的响应作为后续请求的输入,否则这不是 这是一种非常有效的方法,因为每个请求都将被阻塞,直到前一个请求返回。一个更好的 方法是使用 $.all($http.get(...),$http.get(...))

  • 风格

嵌套调用 (the pyramid of doom) 难以阅读。由于每个调用都有相同的失败响应,您可以改为链接这些调用。例如

`$http.get(..).then
 ($http.get(..)).then(
 ($http.get(..)).catch(errHander)`