Angular承诺链接传递的参数

时间:2015-01-04 11:08:11

标签: javascript angularjs promise angular-promise

在我的Angular应用程序中,我正在尝试调用一系列函数,每个函数都返回一个值,该值将成为下一个函数的输入。从概念上讲,它是这样的:

$scope.createPanel = function() {
   var primer3_parameter_id = primer3FromDesignSetting($scope.selector.designSetting);
   var panel = getPanelData(primer3_parameter_id);

   Restangular.all('batches').post(panel).then(function(batch) {
      createBatchDetailRows(batch);   
   });
};

由于远程调用的异步特性,我发现这不起作用:它们返回一个promise而不是一个实际的结果。

我认为我需要做这样的事情:

$scope.createPanel = function() {
  primer3FromDesignSetting($scope.selector.designSetting)
     .then(getPanelData(primer3_parameter_id))
     .then(postPanel(panel))    // the Restangular call wrapped into a new function
     .then(createBatchDetailRows(batch))
     .catch(function(err) {
           // error handler
     }
 };

 function primer3FromDesignSetting(designSetting) {
     var primer3Parameter = _.clone(Restangular.stripRestangular(designSetting));
     primer3Parameter = _.omit(primer3Parameter,panelFields);
     delete primer3Parameter.id;
     Restangular.all('primer3_parameters').post(primer3Parameter).then(function(newPrimer3Parameter) 
     {
         return newPrimer3Parameter.id;
     }, function(error) {
         console.log(error);
     });
  }

$scope.createPanel();

但我无法理解正确的语法。

2 个答案:

答案 0 :(得分:1)

如果要链接异步调用,则返回一个promise(注意返回值)。该承诺的解析将作为参数传递给下一个处理程序(在本例中,它是newPrimer3Parameter.id):

 function primer3FromDesignSetting(designSetting) {
     var primer3Parameter = _.clone(Restangular.stripRestangular(designSetting));
     primer3Parameter = _.omit(primer3Parameter,panelFields);
     delete primer3Parameter.id;
     return Restangular.all('primer3_parameters').post(primer3Parameter).then(function(newPrimer3Parameter) 
     {
         return newPrimer3Parameter.id;
     }, function(error) {
         console.log(error);
     });
  }

答案 1 :(得分:1)

每个promise都会返回successHandler和错误处理程序。所以结构将是这样的:

 primer3FromDesignSetting($scope.selector.designSetting)//Asynchronous task that returns a promise
    .then(SuccessHandler1,ErrorHandler1) //Promise 1 - ErrorHandler optional
    .then(SuccessHandler2,ErrorHandler2) //Promise 2 - ErrorHandler optional
    .then(SuccessHandler3, ErrorHandler3) //Promise 3 - ErrorHandler optional

这里的承诺如何运作(谷歌员工Shyam Sheshadri(以前的谷歌)和Brad Green(Angular团队)):

  1. 每个异步任务都将返回一个promise对象。

  2. 每个promise对象都有一个 then 函数,可以带两个参数,一个成功 处理程序和错误处理程序。

  3. then 函数中的成功或错误处理程序只会被调用一次,之后 异步任务完成。

  4. 然后函数也会返回一个承诺,允许链接多个来电。
  5. 每个处理程序(成功或错误)都可以返回一个值,该值将传递给下一个 在承诺链中发挥作用。
  6. 如果处理程序返回一个promise(发出另一个异步请求),那么下一个 只有在请求完成后才会调用handler(成功或错误)。