Angular js承诺链接

时间:2016-03-07 16:29:38

标签: javascript angularjs angularjs-service angular-promise angularjs-factory

我一直试图弄清楚过去两天的承诺,到目前为止我得到了这个。任何指导方向都会很棒,因为我觉得我很困惑自己。

所以这是我的服务,它必须在服务器更新的图像捕获后按照超时顺序运行:

 def pattendance
   params[:a_ids] ||= []
   ...
 end

},

它到处都是......

P.S。我以建筑为生。

2 个答案:

答案 0 :(得分:2)

首先,@ sjokkogutten的答案是要找到的方法。将您的业务逻辑尽可能高(例如,在服务中)使应用程序更易于维护和测试。

请不要使用$http.get(...).then(onSuccess).except(onError)的第二个参数,因为它不可链接。

then是一个更好的模式。

关于承诺的一些注释

当你链接承诺时,每个$http.get(...) .then(function (result) { return 'getCameraDirectory'; // Or $q.resolve('getCameraDirective'), doesn't matter }) .then(function (result2) { // result2 is 'getCameraDirectory' }); 回调都会收到前一个承诺。

undefined

使用promises时,始终返回一些内容非常重要!很容易忘记一次退货,您的承诺链最终将解析为saveMedia()

您的示例链接了一些方法,但这些方法不会返回任何内容。这意味着下一个链式回调不接收参数。最后,undefined没有返回任何内容,因此整个承诺链解析为then

请注意,整个示例中只有一个return语句。

拒绝

假设在你的一个回调中你想根据条件打破链。

你需要拒绝承诺。所有直接链接的$http.get(...) .then(function (result) { if (result.length > 0) { return result; } else { return $q.reject('result is empty'); // or throwing error } }) .then(function (result2) { // result2 is non empty! }) .catch(function (message) { // this callback is called when result is empty OR when the $http.get call rejects (eg. returns 404) // Return something if you want to chain further return 'Back on track'; }) .then(function (result3) { // result3 === 'Back on track' // This callback is only called when coming from `except` }) .catch(function (message2) { // This callback is called when previous 'except' or 'then' is rejecting }); 都不再被调用。

Array.forEach

答案 1 :(得分:1)

$http已经返回了一个承诺,因此在调用服务时无需使用$q.defer()。相反,我建议将所有$http请求放在单独的服务/服务中:

app.factory('DataService', function($http, $cordovaFileTransfer) {
  var getCameraDirectory = function() {
    return $http.json("/api/...") // returns a promise
  };

 var setCameraMode= function() {
    return $http.json("/api/...") 
  };

 var getCameraDirectory = function() {
    return $http.json("/api/...") 
  };

 var captureMedia = function() {
    return $http.json("/api/...") 
  };

 var saveMedia = function() {
    return  $cordovaFileTransfer.download(url, targetPath, options, trustHosts) // I am not sure, but I am assuming that $cordovaFileTransfer.download() is returning a promise. 
  };

  return {
    getCameraDirectory: getCameraDirectory,
    setCameraMode: setCameraMode,
    captureMedia: captureMedia,
    saveMedia: saveMedia
  }
});

在您的控制器中,您现在可以使用then

解决您的承诺
myApp.controller('MyController', function ($scope, DataService) {     
    DataService.getCameraDirectory().then(
      function(){ //resolve getCameraDirectory 
        // getCameraDirectory successcallback
      },
      function(){
        // getCameraDirectory errorcallback
      }).then( // resolve setCameraMode 
        function(){
          // setCameraMode successcallback
        },
        function(){
          // setCameraMode errorcallback
        }).then( // resolve captureMedia 
          function(){
            // captureMedia successcallback
          },
          function(){
            // captureMedia errorcallback
          }).then(// resolve saveMedia
            function(){
              // saveMedia successcallback
            },
            function(){
              // saveMedia errorcallback
            })   
});

请注意,我实际上没有实现上面的代码,但应该为您提供一个大纲。