2015-01-04 96 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. 如果處理程序返回一個承諾(使另一個異步請求),那麼接下來的 處理器(成功或錯誤)將被該請求完成後纔會叫。