이 글은 여러 코드 예제를 통해 Promise의 기본 사용법을 이해하고 Promise 비동기 액세스 아이디어를 더욱 익히는 데 도움이 될 것입니다.
저는 Promise의 명성에 대해 예전부터 들어왔지만 늘 난해한 일이라는 생각이 들었고 조금 겁이 나고 이해가 되지 않았습니다. 최근 Station B에서 Li Lichao님이 업로드한 Node.js 동영상을 봤습니다. 설명이 매우 명확하다고 느꼈으므로 여기서 더 정리하겠습니다.
자바스크립트는 단일 스레드에서 실행된다는 사실은 모두가 알고 있으므로 데이터를 얻는 데 시간이 걸리는 상황에 직면하면 차단이 발생하고 후속 코드가 실행되지 않습니다. 예를 들어, 아래 코드
function sum(a, b) { const begin = Date.now(); while(Date.now() - begin < 10000) { } return a+b; } console.log(sum(1,2)); console.log("1");
중간에 있는 while 문은 10초 루프를 거쳐 마침내 각각 3과 1을 인쇄했습니다
그러나 우리가 원하는 것은 3이 되도록 허용하는 것입니다. 10초 후에 다시 인쇄되는데 1이 먼저 인쇄됩니다
여기서 setTimeout
을 사용하여 다음과 같이 코드를 수정합니다setTimeout
,修改代码如下
function sum(a, b) { setTimeout(() => { return a+b; },10000) } console.log(sum(1,2)); console.log("1");
运行一下可以看到1确实瞬间被打印出来了,但是本该打印3的位置是undefined
原因在于此时的console.log
同样没有等待setTimeout
走完,无法接收到10秒后的数据
所以为了能够接收到这个10秒后的数据,我们可以采用回调函数的方式
function sum(a, b, callback) { setTimeout(() =>{ callback(a+b); }, 10000) } sum(1,2,(result) => { console.log(result); }); console.log("1");
传入了一个能够接收 a+b 为参数的回调函数 (result) => {console.log(result);}
sum(1,2,(result) => { sum(result, 3, (result) => { sum(result, 4, (result) => { console.log(result); }) }) });
이유는 이때 console.log
도 setTimeout
이 완료될 때까지 기다리지 않아 10시 이후에는 데이터를 받을 수 없기 때문입니다. second
그래서 10초 후에 데이터를 받으려면 콜백 함수
const promise = new Promise(()=>{});
메소드를 사용하여 a+b를 매개변수로 받을 수 있는 콜백 함수를 (result) => log(result);}
콜백 지옥
얼핏 보면 허풍스러운 이름이지만 실제로는 콜백 함수가 여러 겹 중첩되어 발생합니다. 읽기 및 디버깅에 편리합니다.
예를 들어 이번에는 이 합계 함수를 여러 번 호출하려고 합니다. 1+2의 결과를 얻은 후 1+2+3, 1+2+3+4
const promise = new Promise((resolve, reject) => { const flag = true; if (flag) { resolve("resolve datas"); } else { reject("reject data"); } })
Promise란 무엇입니까
Promise를 사용하여 콜백 지옥 문제를 해결하기 전에 먼저 Promise가 무엇인지에 대해 전반적으로 이해해 봅시다.
현재 나의 판단은 Promise가 비동기 데이터에 액세스하는 데 사용되는 개체라는 것입니다.
먼저 빈 Promise가 인쇄되면 어떤 모습일지 살펴보겠습니다
promise.then(result => { console.log(result); }, reason => { console.log(reason); })
가장 중요한 것은 PromiseState와 PromiseResult 두 값입니다. 이에 대해서는 나중에 자세히 설명하겠습니다. Promise에는 이 두 가지 속성이 있다는 것을 알아야 합니다.
그럼 프로미스에 따라 데이터를 저장하는 과정을 살펴보겠습니다. 가장 중요한 것은 해결과 거부가 있다는 것을 아는 것입니다. 예를 들어 다음 코드에서는
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } sum(1,2) .then(result => sum(result,3)) .then(result => sum(result,4)) .then(result => { console.log(result); })
Promise가 데이터를 저장하지 않는 경우 PromiseState의 값은 보류 중이고 PromiseResult의 값은 정의되지 않습니다.
Promise가 데이터 저장을 위해 해결을 사용하는 경우 PromiseState의 값은 보류 중이며 PromiseResult의 값은 해당됩니다. 저장된 값
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } console.log(sum(1,2) .then(result => sum(result,3)))
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } sum(1,2) .then(result => sum(result,3)) .then(result => sum(result,4)) .then(result => { console.log(result); })
promise 通过then方法进行读取后,是个新的Promise对象,比如我们可以打印一下
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } console.log(sum(1,2) .then(result => sum(result,3)))
所以这也就给了我们能多次调用then方法的基础。
而这也就解决了回调地狱的问题。
Promise 是一个可以存取异步数据的对象,通过resolve
和reject
来存储数据,可以通过then
来读取数据
至于其他的.catch
.finally
.race
.any
.all
这些方法就不再多作赘述,详细的见文档
【推荐学习:javascript高级教程】
위 내용은 코드 예제를 통해 Promise를 이해해보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!