programing

Node.js의 약속 이해

linuxpc 2023. 9. 3. 12:12
반응형

Node.js의 약속 이해

제가 이해한 바로는 비동기 코드를 호출하는 세 가지 방법이 있습니다.

  1. 이트예벤):request.on("event", callback);
  2. 백콜):fs.open(path, flags, mode, callback);
  3. 약속들

노드 약속 라이브러리를 찾았는데 이해가 안 됩니다.

누가 약속이 무엇에 관한 것인지, 그리고 왜 그것을 사용해야 하는지 설명해 주시겠습니까?

또한 Node.js에서 제거된 이유는 무엇입니까?

이 질문은 여전히 (나와 같은) 많은 견해를 가지고 있기 때문에, 저는 다음과 같이 지적하고 싶었습니다.

  1. 노드 테스트는 제가 보기에 다소 죽은 것처럼 보이며(마지막 커밋은 약 1년 전) 거의 테스트를 포함하지 않습니다.
  2. 미래 모듈은 제가 보기에 매우 비대해 보이고 문서화되어 있지 않습니다(그리고 명명 규칙이 나쁘다고 생각합니다)
  3. 가장 좋은 방법은 활성화되어 있고 문서화되어 있는 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 :: 이 상태는 초기 상태이며 약속이 이행되지 않거나 거부됨을 의미합니다.

이행됨 :: 약속이 이행되었음을 의미하며, 약속으로 표시된 값을 사용할 준비가 되었음을 의미합니다.

거부됨 :: 작업이 실패하여 약속을 이행할 수 없음을 의미합니다.주를 제외하고, 우리가 정말 이해해야 하는 약속과 관련된 세 가지 중요한 실체가 있습니다.

  1. executor function :: executor function은 수행해야 하는 비동기 작업과 그 결과가 약속으로 표시되는 비동기 작업을 정의합니다.약속 개체가 초기화되는 즉시 실행이 시작됩니다.

  2. resolve :: resolve는 실행자 함수에 전달되는 매개 변수이며, 실행자가 성공적으로 실행될 경우 이 확인을 결과 전달이라고 합니다.

  3. 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

반응형