2015-01-04 3 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. 각 비동기 태스크는 promise 오브젝트를 리턴합니다.

  2. 각 약속 객체는 두 개의 인수, 성공 핸들러 및 오류 핸들러를 취할 수 다음 기능을해야합니다.

  3. 성공 또는 다음 함수에서 오류 처리기는 비동기 작업이 완료된 후, 한 번만 호출됩니다.

  4. 다음 함수는 약속을 반환하여 여러 호출을 연결할 수 있습니다.
  5. 각 처리기 (성공 또는 오류)는 약속 체인의 다음 함수로 전달되는 값을 반환 할 수 있습니다.
  6. 핸들러가 약속을 반환하면 (다른 비동기 요청을 작성하는 경우) 다음 핸들러 (성공 또는 오류)는 요청이 완료된 후에 만 ​​호출됩니다.