2016-09-15 2 views
1

그래서이 문제가 있습니다. 나는 상당히 새로운 것으로, 폼을 관리하는 지시문을 수정하여 모든 작업이 완료되었을 때 제출 단추를 사용 불가능으로 설정 한 다음 다시 사용 가능하도록 설정해야한다고 들었습니다.AngularJS - "Chaining promises"사이의 다른 함수

일반적으로 호출되는 함수에 비동기 호출이 있으므로 순차적으로 코드를 추가하면 작동하지 않습니다.

var ngSubmit = function() { 
    vm.disabled = true; 
    $scope.ngSubmitFunction(); 
    vm.disabled = false; 
} 

ngSubmitFunction() finish에서 비동기 호출이 시작되기 전에 버튼이 활성화됩니다.

그래서 나는 약속이 그 문제를 해결 할 생각 같은 것을 만들어 :

var promise = function() { 
    return $q(function (resolve) {$scope.ngSubmitFunction()}); 
} 
var ngSubmit = function() { 
    vm.disabled = true; 
    promise().then(function() { 
    vm.disabled = false; 
    }); 
} 

이 출력되지 오류를 수행하지만, 결코 (그 때는 호출되지 않습니다) 버튼을 다시 할 수 없습니다.

는 약속 선언의 다른 종류의 시도를 제외하고 동일한 결과 모든이 하나 :이 기능을 그 때는 호출 않지만, 다시 완료 하위 비동기 기능을 기다리지 않습니다

$scope.submitPromise = function() { 
    return $q.when($scope.ngSubmitFunction()); 
} 

. '.then'는 순차적 인 버전처럼 즉시 호출됩니다.

무엇이 ngSubmitFunction()에 있는지 알지 못합니다. 수십 명의 개발자가 사용하며 0에서 여러 개의 비동기 호출을 포함 할 수 있습니다. 그러나 일반적인 시나리오는 같은 :

ngSubmitFunction은() FUNC()

호출 - (갱신 - -) FUNC를 (거세한 숫양은) (

를 (생성) 또는 업데이트를 호출하기로 결정)은 비동기 호출 인 elementFactory.update()를 호출합니다.

- - elementFactory.update(). then (function())이 완료되면 호출됩니다.

- - -이 시점에서 버튼을 다시 활성화해야합니다.

어떻게하면됩니까? 사이에 약속되지 않은 기능으로 약속을 묶는 방법이 있습니까? 또는 다른 모든 작업이 완료되었을 때만 코드를 실행하는 다른 방법이 있습니까? 비동기 호출이 끝났을 때 DataFactory에서 이벤트를 작성하는 것에 대해 생각했지만 update() 함수가 둘 이상의 비동기 호출을 호출하는 경우에는 작동하지 않습니다.

+0

우선 ngSubmitFunction은 무엇을 반환합니까? ... 비동기 함수이고 promise를 반환하지 않거나 콜백 패턴 (입력으로 콜백 함수를 제공함)을 사용하지 않으면 ... 꽤 많은 행운을 빕니다. --- 당신의 약속에 대해 실수를 반복하려고합니다. 약속을 지키십시오. (...) – Jens

+0

당신의 의견은 저를 생각하게 만듭니다. 결국 모든 자식 기능은 결코 수익을 얻지 못했고, 결과적으로 모든 것이 작동하게 만들었습니다. 결국 결국 theres는 항상 약속하기 때문입니다. 이 문제는 3.5M codelines 프로젝트의 모든 컨트롤러를 변경해야하고, devs가 만드는 모든 기능에 대해 항상 return 문을 사용한다는 것을 신뢰해야합니다. 기회는 아닙니다. 관찰자 또는 무엇인가와 함께 ngSubmitFunction()의 "후드"아래에서 호출되는 약속을 "감지"하는 또 다른 방법이 있습니까? – p4x

+0

짧은 대답 : 아니, 그리고 확실히 확실히 호출 스택 아래로 약속을 작동하는 함수에 대한이 동작을 시행하는 것이 좋습니다. 그것은 단지 좋은 연습과 상식 IMO입니다. (분명히 코너 케이스가 있지만 그것들을 남겨 둘 수 있습니다). 비록 모든 약속이 같은 틀에 속해 있고 현재 약속 된 약속에 관해 당신에게 말할 수있는 해킹을했다 할지라도 기다려야 할 것이 무엇인지를 아는 것은 불가능합니다. 모든 것을 기다려야한다고 말할 수도 있습니다. 여기저기서 무한한 자물쇠들. – Jens

답변

0

당신이 그들이 그것을 이런 식으로 작업을해야 할 경우, 비동기 기능, 약속을 반환해야 약속을 사용하는 경우

var ngSubmit = function() { 
    vm.disabled = true; 
    $scope.ngSubmitFunction().then(() => { 
     vm.disabled = false; 
    }); 
} 
0

내가 무엇을 모르는 ngSubmitFunction()

에서 다음 너는 운이 없네 약속이 여기서 널 도와주지 않을거야. Promise 또는 $q.when은 마술처럼 호출을 검사하여 시작한 비동기적인 것을 볼 수 없으며 심지어 대기하기도합니다. ngSubmitFunction()은 비동기 결과 자체에 대한 약속을 반환해야합니다.

마다을 코드베이스에서 작동시켜야합니다. (아마도) 비동기식으로 수행해야 할 것으로 기대되는 결과를 가져 오는 것이 좋습니다. 이 문제를 해결할 방법이 없습니다.

0

누군가가 궁금해하는 경우에는 해결책을 찾지 못했을 것입니다. 따라서 모든 함수 체인에 반환 값을 추가하여 ngSubmitFunction이 약속을 받음으로써 '.then'를 호출하기 전에 함수가 끝날 때까지 기다릴 수 있습니다. 이것은 단 하나의 약속이 함축되어있는 경우에 효과적 일뿐만 아니라 좋은 프로그래밍 습관이기도합니다.

하나 이상의 약속이있는 사례는 거의 없으므로 컨트롤러 자체에서 개별적으로 처리 할 것입니다.

의견을 보내 주셔서 감사합니다.