이 기사에서는 JavaScript의 Deferred 및 Promise 개념을 살펴봅니다. 이는 JavaScript 툴킷(예: Dojo 및 MochiKit)에서 매우 중요한 기능이며 최근 인기 있는 JavaScript 라이브러리인 jQuery(이미 버전 1.5에 있음)에서 첫선을 보였습니다. . Deferred는 미래의 특정 시점에 응답을 반환하는 것이 목적인 "promise" 개체를 생성하여 추상적인 비차단 솔루션(예: Ajax 요청에 대한 응답)을 제공합니다. 이전에 "약속"을 접하지 못했다면 아래에서 더 자세히 다룰 것입니다.
추상적으로 말하면 지연은 완료하는 데 오랜 시간이 걸리는 작업을 나타내는 방법으로 이해할 수 있습니다. 차단 기능과 비교하면 완료될 때까지 애플리케이션을 차단하는 것이 아니라 비동기식입니다. 그런 다음 결과를 반환합니다. 지연된 객체는 즉시 반환되며 콜백 함수를 지연된 객체에 바인딩할 수 있으며 비동기 처리가 완료된 후에 호출됩니다.
Promise
Promise 및 Deferred 구현 세부 사항에 대한 정보를 읽어보셨을 것입니다. 이 장에서는 지연을 지원하는 거의 모든 JavaScript 프레임워크에 적용할 수 있는 Promise 작동 방식을 간략하게 소개합니다.
일반적으로 Promise는 소프트웨어 엔지니어링에서 지연(또는 미래) 개념을 설명하기 위한 솔루션을 제공하는 모델 역할을 합니다. 그 뒤에 있는 아이디어는 이미 소개되었습니다. 메서드를 실행한 다음 결과가 반환될 때까지 애플리케이션을 차단하는 대신 약속 개체가 미래 값을 충족하도록 반환됩니다.
제3자 API의 데이터에 크게 의존하는 웹 애플리케이션을 구축한다고 가정하면 이해하는 데 도움이 될 것입니다. 그러면 우리는 API 응답의 지연 시간을 알 수 없고 결과를 반환할 때까지 애플리케이션의 다른 부분이 차단될 수 있다는 일반적인 문제에 직면하게 됩니다. Deferred는 비차단 기능을 갖추고 코드에서 완전히 분리되어 이 문제에 대한 더 나은 솔루션을 제공합니다.
Promise/A Proposal은 콜백을 등록하기 위한 'then' 메소드를 정의합니다. 이 메소드는 핸들러 함수가 결과를 반환할 때 실행됩니다. Promise를 반환하는 의사 코드는 다음과 같습니다.
jQuery.Deferred() | 创建一个新的Deferred对象的构造函数,可以带一个可选的函数参数,它会在构造完成后被调用。 |
jQuery.when() | 通过该方式来执行基于一个或多个表示异步任务的对象上的回调函数 |
jQuery.ajax() | 执行异步Ajax请求,返回实现了promise接口的jqXHR对象 |
deferred.then(resolveCallback,rejectCallback) | 添加处理程序被调用时,递延对象得到解决或者拒绝的回调。 |
deferred.done() |
当延迟成功时调用一个函数或者数组函数. |
deferred.fail() |
当延迟失败时调用一个函数或者数组函数.。 |
deferred.resolve(ARG1,ARG2,...) | 调用Deferred对象注册的‘done'回调函数并传递参数 |
deferred.resolveWith(context,args) | 调用Deferred对象注册的‘done'回调函数并传递参数和设置回调上下文 |
deferred.isResolved | 确定一个Deferred对象是否已经解决。 |
deferred.reject(arg1,arg2,...) | 调用Deferred对象注册的‘fail'回调函数并传递参数 |
deferred.rejectWith(context,args) | 调用Deferred对象注册的‘fail'回调函数并传递参数和设置回调上下文 |
deferred.promise() | 返回promise对象,这是一个伪造的deferred对象:它基于deferred并且不能改变状态所以可以被安全的传递 |