AngularJS를 사용하여 Promise를 처리할 때 때로는 여러 Promise를 처리해야 하는 상황에 직면하게 됩니다.
가장 간단한 해결책은 각 약속에 대해 then을 적용하는 것입니다. 다음과 같습니다:
var app = angular.module("app",[]); app.controller("AppCtrl", function($q. $timeout){ var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); $timeout(function(){ one.resolve("one done"); }, Math.random() * 1000) $timeout(function(){ two.resolve("two done"); }, Math.random() * 1000) $timeout(function(){ three.resolve("three done"); }, Math.random() * 1000) functioin success(data){ console.log(data); } one.promise.then(success); two.promise.then(success); three.promise.then(success); })
더 좋은 방법이 있나요?
$q.all 메소드는 약속의 배열을 허용할 수 있으며 다음과 같이 호출됩니다.
var all = $q.all([one.promise, two.promise, three.promise]); all.then(success);
약속이란 무엇인가요?
Promise는 값을 비동기적으로 처리하는 방법입니다. Promise는 함수에서 발생하는 최종 가능한 반환 값 또는 예외를 나타내는 개체입니다. 이를 에이전트의 원격 개체로 간주할 수 있습니다. . promise도 일종의 비동기 처리 방법이라면 XHR과 $.ajax와의 차이점을 생각해 보겠습니다.
페이지가 로드된 후 XHR 요청과 같이 비동기적으로 반환된 데이터에 응답하기 위해 js가 클로저나 콜백을 사용하는 것이 일반적입니다. 콜백 함수의 트리거링에 의존하지 않고 마치 반환된 것처럼 데이터와 정상적으로 상호 작용할 수 있습니다.
그럼 ng가 제안한 약속은 어떤 문제를 해결하려는 걸까요? 콜백은 오랫동안 사용되어 왔으며 일반적으로 다른 콜백에 의존하는 콜백이 있고 각 호출 후에 오류를 표시해야 하는 경우 디버깅이 매우 어려워집니다. 차이점은 Promise가 또 다른 추상화를 제공한다는 것입니다. 이러한 함수는 Promise 객체를 반환합니다.
Promise를 사용해야 하는 이유
Promise 사용의 이점 중 하나는 콜백의 고정된 사고 논리에서 벗어날 수 있다는 것입니다. Promise를 사용하면 비동기 처리 메커니즘을 동기화와 비슷하게 보이게 만들어 예상대로 반환 값과 예외 값을 캡처할 수 있습니다. 오류는 프로그램에서 언제든지 포착될 수 있으며 프로그램 예외에 의존하는 후속 코드를 우회할 수 있습니다. 이 동기화의 이점에 대해 생각할 필요가 없습니다. 따라서 Promise를 사용하는 목적은 코드를 비동기적으로 실행하는 기능을 유지하면서 기능적 조합 및 오류 버블링 기능을 얻는 것입니다.
Promise는 일급 개체이며 몇 가지 규칙이 있습니다.
• 해결 또는 거부는 하나만 호출됩니다.
• Promise가 실행되거나 거부되는 경우 해당 Promise에 의존하는 핸들러는 계속 호출됩니다.
• 핸들러는 항상 비동기식으로 호출됩니다.