2015-01-04 71 views
1

在我的角度应用我想打电话一系列的功能,每一个返回其成为下一个输入的值链接。概念上,它是这样的:角承诺与传递的参数

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

我发现这是不行的,由于远程调用的异步性质:它们返回一个承诺,而不是实际的结果。

我想我需要做这样的事情:

$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(); 

但我不能完全得到我的头周围正确的语法。

回答

1

如果你想链的异步调用,然后返回一个承诺(注意返回值)。这一承诺的决议将作为参数传递给下一个处理程序,然后传递(在这种情况下,它是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

每个承诺将返回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 

这里的承诺将如何工作(据谷歌员工希亚姆Sheshadri(原谷歌)和布拉德·格林(角队)):

  1. 每个异步任务将返回一个承诺对象。

  2. 每个承诺对象也有可能需要两个参数,一个成功 处理程序和错误处理一个然后功能。

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

  4. 然后功能也将返回一个承诺,允许链接多个电话。
  5. 每个处理程序(成功或错误)可以返回一个值,该值将被传递到下一个 功能在承诺的链。
  6. 如果处理程序返回一个承诺(使另一个异步请求),那么接下来的 处理器(成功或错误)将被该请求完成后才会叫。