>  기사  >  웹 프론트엔드  >  js의 Promise 인스턴스 분석

js의 Promise 인스턴스 분석

小云云
小云云원래의
2018-02-05 10:00:452189검색

nodejs가 매우 빠르다는 것은 누구나 알고 있습니다. 왜 그렇게 빠른가요? 그 이유는 노드가 기다려야 하는 이벤트를 처리하기 위해 비동기 콜백을 사용하여 코드가 어딘가에서 기다리지 않고 계속 실행되기 때문입니다. 하지만 단점도 있습니다. 예를 들어 이 콜백을 실행한 후 다음 콜백을 실행해야 하며 이로 인해 중첩 및 불분명한 코드가 발생하므로 매우 어렵습니다. . "콜백 감옥"에 들어가기 쉽습니다. 다음과 같은 예가 쉽게 발생할 수 있습니다:

async(1, function(value){
 async(value, function(value){
 async(value, function(value){
  async(value, function(value){
  async(value, function(value){
   async(value, final);
  });
  });
 });
 });
});

이렇게 쓰면 사람들이 무너질 텐데, 이 문제를 해결할 수 있는 방법이 있나요, 아니면 다른 방법이 있나요? 글쓰기? 대답은 '예'입니다. es6의 새로운 promise 객체와 es7의 async wait가 이 문제를 해결할 수 있습니다. 물론 여기서는 promise 객체를 먼저 소개하고 es7의 async wait는 다음 기사에서 공유하겠습니다. Promise 객체는 아래에 소개됩니다.

2. 소개

Promise는 비동기 작업을 처리하는 데 사용되는 개체로, 비동기 호출을 더욱 우아하고 보기 좋게 작성할 수 있습니다. 이름에서 알 수 있듯이 Promise를 뜻하는데, Promise를 사용한 후에는 성공이든 실패든 반드시 우리에게 답장을 해준다는 뜻이므로 실행에 대한 걱정은 하지 않아도 된다. 떨어져, 하하. 따라서 Promise에는 보류(진행 중), 해결(완료), 거부(실패)의 세 가지 상태가 있습니다. 비동기적으로 반환된 구조만 상태를 변경할 수 있습니다. 따라서 일반적으로 Promise 프로세스는 보류->해결 또는 보류->거부라는 두 가지 프로세스만 있습니다.

Promise 개체에는 콜백 함수를 실행하는 데 더 일반적으로 사용되는 then 메서드가 있습니다. then 메서드는 두 개의 매개변수를 받습니다. 첫 번째는 성공적인 해결 콜백이고, 다른 하나는 실패한 거부 콜백입니다. 콜백. 매개변수는 선택사항입니다. 그리고 then 메소드는 체인에서 호출될 수 있도록 promise 객체를 반환할 수도 있습니다. 다음 코드는 다음과 같습니다.

var Pro = function (time) {
   //返回一个Promise对象
   return new Promise(function (resolve, reject) {
    console.log('123');
    //模拟接口调用
    setTimeout(function () {
     //这里告诉Promise 成功了,然后去执行then方法的第一个函数
     resolve('成功返回');
    }, time);
   })
  };
  (function(){
   console.log('start');
   Pro(3000)
   .then(function(data){
    console.log(data);
    return Pro(5000);})
   .then(function(data){
    console.log(data);
    console.log('end');
   })
  })();

위 코드에서는 Pro 변수가 정의된 다음 여기에 익명 함수가 할당됩니다. 함수는 Promise 객체를 반환한 다음 객체에서 함수를 수신하고 확인 및 전달합니다. 메서드를 각각 매개 변수로 거부하고 setTimeOut을 사용하여 비동기 요청을 시뮬레이션하면 then 메서드의 함수가 호출됩니다. 결과는 다음과 같습니다:

3. Promise api 

1, Promise.resolve()
2, Promise.reject()
3, Promise.prototype.then()
4, Promise.prototype.catch ()
5. Promise.all() // 모두 완료되었으며
6. Promise.race() // 하나만 완료하면 or

1과 동일합니다. ()는 이제 Promise 객체로 변환됩니다. Promise.resolve('test')==new Promise(resolve=>resolve('test'))

2도 반환됩니다. ;

3 상태의 Promise 객체 then 메소드는 위에 소개되었으므로 여기서는 소개하지 않겠습니다.

4.catch(): 오류 발생 시 콜백 함수입니다.

5. Promise.all()은 모든 결과가 완료된 후에만 then()의 성공적인 작업에 적합합니다. 예:

let p1 =new Promise(function(resolve,reject){
   resolve(1);
  });
  let p2 = new Promise(function(resolve,reject){
   resolve(2);
  });
  let p3 = new Promise(function(resolve,reject){
   resolve(3);
  });
  Promise.all([p1, p2, p3]).then(function (results) {
   console.log('success:'+results);
  }).catch(function(r){
   console.log("error");
   console.log(r);
  });

최종 출력:

6. Promise.race()의 기능은 하나의 인스턴스가 상태를 변경하는 한 동시에 여러 인스턴스를 실행하는 것입니다.

4. 예시

var Pro = function () {
   //返回一个Promise对象
   return new Promise(function (resolve, reject) {
    //模拟接口调用
    setTimeout(function () {
     resolve(true);
    }, 1000);
   })
  };
  var Pro2 = function () {
   //返回一个Promise对象
   return new Promise(function (resolve, reject) {
    //模拟接口调用
    setTimeout(function () {
     resolve('Pro2成功执行');
    }, 1000);
   })
  };
  
  Pro().then(function(data){
   var val = data;
   console.log(val)
   if (val) {
    console.log(1111)
    return Pro2()
   }
   
  }).then(function(data1){
   console.log(data1)
  })

출력:

이러한 방식으로 then 메소드를 사용하여 체인 호출을 구현할 수 있습니다.

관련 권장사항:

ES6 Promise 확장된 Always 메소드 인스턴스 세부 설명

jQuery의 Promise를 올바르게 사용하는 방법

promsie.all 및 Promise 순차적 실행 세부 설명

위 내용은 js의 Promise 인스턴스 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.