> 웹 프론트엔드 > JS 튜토리얼 > ES6의 새로운 기능: 지연된 객체 Promise 내장 JavaScript 코드 세부정보

ES6의 새로운 기능: 지연된 객체 Promise 내장 JavaScript 코드 세부정보

黄舟
풀어 주다: 2017-03-07 14:26:43
원래의
1506명이 탐색했습니다.

Promise의 기본 사용법:

Promise를 사용하는 것은 JS 비동기 실행 중 콜백 함수 중첩 콜백 함수 문제를 해결하기 위한 것입니다.

new를 통해 Promise를 인스턴스화합니다. 생성자에는 두 개의 매개변수가 필요하며, 함수가 성공적으로 실행된 후 실행됩니다. 두 번째 함수 함수 실행 실패 후 실행될 함수를 거부합니다:

new Promise(function(resolve , reject) {
});
로그인 후 복사

Promise를 통해 콜백 함수를 계층별이 아닌 선형 방식으로 작성합니다. 레이어 콜백;

fn("args", function(a) {
    fn1("foo", function(b) {
        fn2("bar", function(c) {
            fn3("baz", function(d) {
                alert("回调成功,获知的内容为:"+a+b+c+d)
            })
        })
    })
})
로그인 후 복사

위 데모에는 성공한 콜백만 포함되어 있습니다.

Promise를 사용하면 선형으로 수정할 수 있습니다. 읽기 습관에 맞춰서

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(2);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(3);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
});
로그인 후 복사
로그인 후 복사

아래에 로직을 작성하세요. 이것은 ajax가 비동기적으로 데이터를 가져오는의 예입니다. 우리는 콜백 함수를 사용했습니다. ;

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<script>
    var callback = function(res) {
        console.log(res);
    };
    var ajax = function(url, callback) {
        var r = new XMLHttpRequest();
        r.open("GET", url, true);
        r.onreadystatechange = function () {
            if (r.readyState != 4 || r.status != 200) return;
            var data = JSON.parse(r.responseText);
            callback(data);
        };
        r.send();
    };
    //执行请求:
    ajax("http://www.filltext.com?rows=10&f={firstName}", callback);
    //再做别的事情;
</script>
</body>
</html>
로그인 후 복사

ES6에는 Promise가 내장되어 있으므로 위의 콜백을 promise 메서드로 다시 작성할 수 있습니다. 먼저 ajax 함수는 Promise 객체를 반환합니다.

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
        var callback = function(res) {
            console.log(res);
        };
        var ajax = function(url) {
            return new Promise(function(resolve, reject) {
                var r = new XMLHttpRequest();
                r.open("GET", url, true);
                r.onreadystatechange = function () {
                    if (r.readyState != 4 || r.status != 200) return;
                    var data = JSON.parse(r.responseText);
                    resolve(data);
                };
                r.send();
            })
        };
        //执行请求:
        ajax("http://www.filltext.com?rows=10&f={firstName}").then(function(data) {
            callback(data);
        });
        //再做别的事情;
    </script>
</body>
</html>
로그인 후 복사

Promise 인스턴스의 세 가지 상태:

인스턴스화된 각 Promise에는 보류 중(대기 중) 거부됨(거부됨) 해결됨(해결됨)의 세 가지 상태가 있습니다. Reject()가 실행되면 Promise의 상태는 거부되고 이 상태는 취소할 수 없습니다.

then 메소드:

then 메소드는 두 개의 매개변수를 받습니다. 첫 번째는 함수의 성공 콜백이고, 두 번째는 함수의 실패 콜백입니다.

var promise = new Promise(function(resolve , reject) {
    resolve(); //执行成功回调;
});
console.log(0);
promise.then(function(val) {
    console.log(1); 
}, function() {
    console.log("失败");
});
console.log("2");
로그인 후 복사
var promise = new Promise(function(resolve , reject) {
    reject();
});
console.log(0);
promise.then(function(val) {
    console.log(1);
}, function() {
    console.log("失败");
});
console.log("2");
로그인 후 복사

Then 메소드는 매번 Promise 인스턴스를 반환합니다. then의 첫 번째 매개변수는 성공 콜백입니다. 이 성공적인 콜백의 매개변수는 다음과 같습니다. 이전 Promise 인스턴스에 의해 실행된 해결 메소드의 매개변수

일반적으로 then 메소드는 현재 <🎜를 반환합니다. >promise , then 메소드에서 새 Promise 인스턴스가 반환되면 이 기능을 사용하여 다층 콜백을 구현할 수 있습니다. 🎜>코드가 비동기식이든 동기식이든 관계없이 Promise의 then 메서드를 사용할 수 있습니다. 동기식 코드는 then 메서드의 첫 번째 매개변수에 직접 작성하고, 필수 매개변수는 확인을 통해 다음 then 메서드에 전달됩니다.

비동기 코드인 경우 Promise 인스턴스를 직접 반환합니다.

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(2);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(3);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
});
로그인 후 복사
로그인 후 복사

catch 메서드:

catch 메서드는

실패 콜백과 동일합니다. 이전 비동기 함수

throws 오류가 발생하면 오류가 포착되고 catch 메소드 또는 실패 콜백이 실행됩니다.

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return 2;
}).then(function(val) {
    console.log(val);
    return 3;
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve,reject) {
        //异步操作些这里
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
    return 5;
}).then(function(val) {
    console.log(val);
});
로그인 후 복사
Promise의 오류는 오류가 계층별로 전달됩니다. 잡히지 않으면 캡처될 때까지 다음 개체인

에 전달되고 계속 실행됩니다.

var promise = new Promise(function(resolve , reject) {
    resolve(); //执行成功回调;
});
console.log(0);
promise.then(function(val) {
    console.log("成功");
    throw new Error("heheda");
}).catch(function(e) {
    console.log(e);
}).then(function() {
    console.log("继续执行");
});
로그인 후 복사
생성자 Promise의 네 가지 메서드:

생성자 Promise에는 Promise .all, Promise.race, Promise.reject, Promise.resolve의 네 가지 메소드가 있습니다.

Promise.all(iterable)

모두 실행되는 경우 Promise 객체를 반환합니다. 반복 가능한 매개변수의 Promise가 해결되면 Promise도 해결됩니다 all 메소드는 인스턴스 메소드가 아닌
Promise 함수

의 메소드입니다. 매개변수는 배열이고 배열은 모두

Promise.예 :

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            throw new Error("err");
        });
    }).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            resolve(3);
        });
    }).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            resolve(4);
        });
    }).then(function(val) {
        console.log(val);
    }).catch(function(err) {
        console.log(err);
    }).then(function() {
        console.log("继续执行")
    })
로그인 후 복사
Promise.race(iterable)

iterable 매개변수가 성공하거나 실패하면 상위 Promise는 성공 반환 값 또는 하위 Promise의 실패 세부정보를 매개변수로 사용하여 상위 Promise에 바인딩된 해당 핸들을 즉시 호출하고 Promise 개체를 반환합니다.


Promise.reject(reason)

Promise의 거부된 핸들을 호출하고 이 Promise 객체를 반환합니다.


Promise.resolve(value)

성공 값 값으로 Promise 객체를 해결합니다. 값이 then 가능한 경우(즉, then 메소드 사용) 반환된 Promise 객체는 값을 "따르며" 값의 최종 상태를 채택합니다. 그렇지 않으면 반환 값은 반환된 값을 충족(fullfil)하기 위해 이 값을 사용합니다. 약속의 대상.


공식 예:

var p0 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(0)
    },1000);
})
var p1 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(1)
    },2000);
})
var p2 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(2)
    },3000);
})
Promise.all([p0,p1,p2]).then(function(arr) {
    console.log(arr)
})
로그인 후 복사
이제 Promise가 있으므로 쉽게 사용할 수 있도록 XMLHttpRequest를 GET 메서드로 캡슐화할 수 있습니다.
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<p id="log"></p>
<script>
    &#39;use strict&#39;;
    var promiseCount = 0;
    function testPromise() {
        var thisPromiseCount = ++promiseCount;

        var log = document.getElementById(&#39;log&#39;);
        log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) 开始(同步代码开始)<br/>&#39;);

        // 我们创建一个新的promise: 然后用&#39;result&#39;字符串解决这个promise (3秒后)
        var p1 = new Promise(function (resolve, reject) {
            // 解决函数带着解决(resolve)或拒绝(reject)promise的能力被执行
            log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) Promise开始(异步代码开始)<br/>&#39;);

            // 这只是个创建异步解决的示例
            window.setTimeout(function () {
                // 我们满足(fullfil)了这个promise!
                resolve(thisPromiseCount)
            }, Math.random() * 2000 + 1000);
        });

        // 定义当promise被满足时应做什么
        p1.then(function (val) {
            // 输出一段信息和一个值
            log.insertAdjacentHTML(&#39;beforeend&#39;, val + &#39;) Promise被满足了(异步代码结束)<br/>&#39;);
        });

        log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) 建立了Promise(同步代码结束)<br/><br/>&#39;);
    }
    testPromise();
</script>
</body>
</html>
로그인 후 복사

그런 다음

function get(url) {
  // Return a new promise.
  return new Promise(function(resolve, reject) {
    // Do the usual XHR stuff
    var req = new XMLHttpRequest();
    req.open(&#39;GET&#39;, url);

    req.onload = function() {
      // This is called even on 404 etc
      // so check the status
      if (req.status == 200) {
        // Resolve the promise with the response text
        resolve(req.response);
      }
      else {
        // Otherwise reject with the status text
        // which will hopefully be a meaningful error
        reject(Error(req.statusText));
      }
    };

    // Handle network errors
    req.onerror = function() {
      reject(Error("Network Error"));
    };

    // Make the request
    req.send();
  });
}
로그인 후 복사
가짜 데이터의 주소를 직접 설정할 수 있으며 콘솔을 통해 요청할 수 있습니다.

캡슐화하는 경우. 이미지를 비동기적으로 로드하기 위한 XMLHttpRequest into Promise: http: //www.php.cn/


기타:

위 내용은 Promise에 대한 몇 가지 기본 지식입니다. , 기타 지식 포인트도 있습니다. 능력이 제한되어 있으므로 하나씩 소개하지는 않겠습니다(Promise.resolve의 다양한 매개변수, Generator와 함께 사용, Promise의 추가 메소드 등). Promise의 실행 프로세스를 그려보면 Promise를 더 잘 이해할 수 있습니다. Promise는 여전히 상당히 혼란스럽습니다.

브라우저 지원:


Chrome 32, Opera 1, Firefox 29, Safari 8, Microsoft Edge 등의 브라우저는 모두 기본적으로 지원됩니다.

위 내용은 ES6의 새로운 기능입니다. 내장된 JavaScript Delay 객체 Promise 코드가 자세히 소개되어 있습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿