Node.js의 약속 이해
제가 이해한 바로는 비동기 코드를 호출하는 세 가지 방법이 있습니다.
- 이트예벤):
request.on("event", callback);
- 백콜):
fs.open(path, flags, mode, callback);
- 약속들
노드 약속 라이브러리를 찾았는데 이해가 안 됩니다.
누가 약속이 무엇에 관한 것인지, 그리고 왜 그것을 사용해야 하는지 설명해 주시겠습니까?
또한 Node.js에서 제거된 이유는 무엇입니까?
이 질문은 여전히 (나와 같은) 많은 견해를 가지고 있기 때문에, 저는 다음과 같이 지적하고 싶었습니다.
- 노드 테스트는 제가 보기에 다소 죽은 것처럼 보이며(마지막 커밋은 약 1년 전) 거의 테스트를 포함하지 않습니다.
- 미래 모듈은 제가 보기에 매우 비대해 보이고 문서화되어 있지 않습니다(그리고 명명 규칙이 나쁘다고 생각합니다)
- 가장 좋은 방법은 활성화되어 있고 문서화되어 있는 q 프레임워크인 것 같습니다.
node.js의 약속은 몇 가지 일을 하겠다고 약속한 다음 성공과 실패뿐만 아니라 시간 초과를 처리하기 위해 실행되는 별도의 콜백을 가지고 있었습니다.node.js에서 약속을 생각하는 또 다른 방법은 성공과 오류라는 두 가지 이벤트만 방출할 수 있는 방출기라는 것이었습니다.
약속의 멋진 점은 그것들을 종속성 체인으로 결합할 수 있다는 것입니다(약속 A와 약속 B가 완료된 경우에만 약속 C를 수행하십시오).
core node.js에서 이들을 제거함으로써 코어 위에 앉을 수 있는 약속의 다른 구현으로 모듈을 구축할 수 있는 가능성을 만들었습니다.이 중 일부는 노드 약속 및 미래입니다.
약속은 말하자면 작업의 "최종" 결과를 나타내는 "사물"입니다.여기서 주목해야 할 점은 어떤 일이 발생했을 때의 세부 사항을 추상화하고 어떤 일이 발생한 후에 어떤 일이 발생해야 하는지에 초점을 맞출 수 있게 한다는 것입니다.이로 인해 콜백 내부에 콜백이 있는 대신 코드가 다음과 같이 표시됩니다.
var request = new Promise(function(resolve, reject) {
//do an ajax call here. or a database request or whatever.
//depending on its results, either call resolve(value) or reject(error)
//where value is the thing which the operation's successful execution returns and
//error is the thing which the operation's failure returns.
});
request.then(function successHandler(result) {
//do something with the result
}, function failureHandler(error) {
//handle
});
약속의 사양에 따르면 약속은
then
메소드는 주어진 successHandler 또는 failureHandler 콜백이 완료되었을 때 이행되는 새 약속을 반환해야 합니다.즉, 수행해야 하는 비동기 작업 집합이 있을 때 약속을 연결할 수 있으며 콜백을 사용한 것처럼 작업 순서가 보장됩니다.따라서 콜백 내부의 콜백을 전달하는 대신, 약속이 체인으로 연결된 코드는 다음과 같습니다.
var doStuff = firstAsyncFunction(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
};
doStuff
.then(secondAsyncFunction) //returns a promise
.then(thirdAsyncFunction); //returns a promise
약속과 약속이 멋진 이유에 대해 더 자세히 알고 싶다면 Domenic의 블로그를 확인하십시오. http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
PouchDB의 저자가 제공하는 약속에 대한 이 새로운 튜토리얼은 아마도 제가 지금까지 본 것 중 최고일 것입니다.그것은 올바른 사용 패턴과 심지어 다른 튜토리얼에서도 여전히 일반적으로 사용되는 몇 가지 안티 패턴을 보여주는 고전적인 신인의 실수를 현명하게 커버합니다!
맛있게 드세요!
PS 이 질문의 다른 부분은 다른 사람들이 잘 다루었기 때문에 답변하지 않았습니다.
Mike Taulty는 WinJS Promise 라이브러리가 작동하는 방식을 설명하는 비디오를 각각 10분도 채 되지 않습니다.
이 비디오들은 꽤 유용한 정보를 제공하며 Mike는 엄선된 코드 예제 몇 가지를 사용하여 Promise API의 성능을 보여줍니다.
var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });
promise = promise.then(
function (xhr) {
},
function (xhr) {
// handle error
});
예외를 처리하는 방법에 대한 처리가 특히 좋습니다.
WinJs 참조에도 불구하고, Promise API는 많은 구현에서 광범위하게 유사하기 때문에 일반적인 관심 비디오 시리즈입니다.
RSVP는 Promise/A+ 테스트 제품군을 통과하는 경량 Promise 구현입니다.저는 이 API가 WinJS 인터페이스와 스타일이 비슷하기 때문에 매우 좋아합니다.
2014년 4월 업데이트
참고로 WinJS 라이브러리는 이제 오픈 소스입니다.
약속의 또 다른 장점은 오류 처리와 예외 던지기 및 잡기가 콜백으로 처리하는 것보다 훨씬 낫다는 것입니다.
Bluebird 라이브러리는 약속을 구현하고 긴 스택 추적을 제공하며 매우 빠르며 탐지되지 않은 오류에 대해 경고합니다.http://bluebirdjs.com/docs/benchmarks.html 에 따르면 다른 약속 라이브러리보다 더 빠르고 더 적은 메모리를 사용합니다.
약속이란 정확히 무엇입니까?
약속은 단순히 비동기 작업의 결과를 나타내는 개체입니다.약속은 다음 세 가지 상태 중 하나일 수 있습니다.
pending :: 이 상태는 초기 상태이며 약속이 이행되지 않거나 거부됨을 의미합니다.
이행됨 :: 약속이 이행되었음을 의미하며, 약속으로 표시된 값을 사용할 준비가 되었음을 의미합니다.
거부됨 :: 작업이 실패하여 약속을 이행할 수 없음을 의미합니다.주를 제외하고, 우리가 정말 이해해야 하는 약속과 관련된 세 가지 중요한 실체가 있습니다.
executor function :: executor function은 수행해야 하는 비동기 작업과 그 결과가 약속으로 표시되는 비동기 작업을 정의합니다.약속 개체가 초기화되는 즉시 실행이 시작됩니다.
resolve :: resolve는 실행자 함수에 전달되는 매개 변수이며, 실행자가 성공적으로 실행될 경우 이 확인을 결과 전달이라고 합니다.
reject :: reject는 실행자 함수에 전달되는 또 다른 매개 변수이며, 실행자 함수가 실패할 때 사용됩니다.실패 이유를 거부자에게 전달할 수 있습니다.
따라서 약속 개체를 만들 때마다 실행자, 해결 및 거부를 제공해야 합니다.
참조 :: 약속
저도 최근에 node.js의 약속에 대해 알아보고 있습니다.현재까지 when.js는 속도와 리소스 사용 때문에 가야 할 길인 것처럼 보이지만, Q.js에 대한 문서는 저에게 훨씬 더 나은 이해를 주었습니다.따라서 when.js but q.js 문서를 사용하여 주제를 이해합니다.
q.js에서 github에서 나를 읽었습니다.
함수가 차단 없이 값을 반환하거나 예외를 던질 수 없는 경우 대신 약속을 반환할 수 있습니다.약속은 함수가 최종적으로 제공할 수 있는 반환 값 또는 던져진 예외를 나타내는 개체입니다.약속을 원격 개체의 프록시로 사용하여 지연 시간을 극복할 수도 있습니다.
Promise 개체는 비동기 작업의 완료 또는 실패를 나타냅니다.
그래서 약속을 이행하기 위해서는 두 부분이 필요합니다.
1. 약속 만들기:
약속 생성자는 확인 및 거부 매개 변수가 2개인 실행자라는 함수를 수락합니다.
function example(){ return new Promise (function(resolve , reject){ //return promise object if(success){ resolve('success'); //onFullfiled }else{ reject('error'); //onRejected } }) }
2. 약속을 처리하는 것:
Promise 개체에는 Promise 개체를 처리하는 세 가지 방법이 있습니다.
1.Prototype.catch(거부 시)
2.prototype.promise.then.(전체 파일에 표시)
3.약속. 시제품.마지막으로(전체 파일, 거부 시)
example.then((data) =>{ //handles resolved data console.log(data); //prints success }).catch((err) => { //handles rejected error console.log(err); //prints error })
언급URL : https://stackoverflow.com/questions/4296505/understanding-promises-in-node-js
'programing' 카테고리의 다른 글
젠드 프레임워크 폼 해시(토큰)를 AJAX와 함께 사용하는 방법 (0) | 2023.09.03 |
---|---|
데이터베이스의 자격 증명을 어디에 보관해야 합니까? (0) | 2023.09.03 |
Spring REST - ZIP 파일을 생성하여 클라이언트로 전송 (0) | 2023.09.03 |
Chrome의 ASP.NET에서 이상한 focus_change nikkomsgchannel 오류가 발생함 (0) | 2023.09.03 |
가져오기 오류: DLL 로드 실패: %1은 올바른 Win32 응용 프로그램이 아닙니다.하지만 DLL은 거기에 있습니다. (0) | 2023.09.03 |