약속이란 무엇입니까?
Promise 영어 번역은 약속, 약속을 의미합니다. 그 기능은 중국의 의미와 같으며 약속입니다.
MDN의 설명 :
Promise 개체는 프록시 개체 (프록시 값)이며 Promise 개체가 생성 될 때 프록시 개체의 값을 알 수 없습니다. 비동기 작업의 성공 및 실패에 대해 해당 처리 방법 (핸들러)을 바인딩 할 수 있습니다. 이를 통해 비동기 메서드는 동기 메서드와 같은 값을 반환 할 수 있지만 최종 실행 결과를 즉시 반환하는 대신 향후 결과를 나타낼 수있는 promise 객체입니다.
너무 많이 말했지만 실제로는 언어로 번역됩니다.
1. 며느리가 배가 고파서 먹어야하므로 음식을 사러 길거리에 가고 싶습니다 ( 비동기 방식 )
2. 그녀는 언제인지 모릅니다. 나는 음식을 사서 돌아올 것이다 ( 비동기 방식은 몇 초 동안 실행될 것이다 ).
3. 그러나 음식을 사서 집에 돌아온 후에는 며느리가 먹을 수 있도록 돼지 갈비찜을 만들 것이다 . 비동기 메서드가 실행되고 반환 값을 처리
해야합니다 .) 이 때 내가 무엇을해야하는지, 약속을 사용할 것입니다 : 이건
말만 해주세요 이거 내놔, 쇼핑하러 가겠다 고 약속 해요. 곧 돼지 갈비 내가 그것을 구입 완료로, 나는 즉시 완료로 먹고 전화한다 (이 장소는 동일합니다 약속 체인 호출 ), 당신은 지금 무엇을하고 있는지? 당신은 (Douyin와 함께 게임을 즐길 수 있습니다 않습니다 다른 코드의 호출에 영향을 미치지 않습니다 ).
Promise에는 다음 상태가 있습니다.
보류 중 : 초기 상태, 성공 또는 실패 상태가 아님 (음식을 사러 나갔고, 당신은 내가 돌아올 때까지 기다리 셨습니다)
이행 됨 : 작업이 성공적으로 완료되었음을 의미합니다. (음식을 사서 집에 가서 며느리에게 먹고 싶은 음식이 있다고 말 해주세요)
거부 됨 : 수술이 실패했음을 의미합니다. (음식을 못 받았는데 테이크 아웃 주문 해주시 겠어요)
보류 상태의 Promise 객체는 이행 상태로 변경되어 해당 상태 처리 방법에 값을 전달하거나 실패 상태 (거부 됨)로 변경되어 실패 정보를 전달할 수 있습니다. 이러한 상황 중 하나가 발생하면 Promise 개체의 then 메서드에 바인딩 된 처리기가 호출됩니다.
then 메소드에는 onfulfilled 및 onrejected라는 두 개의 매개 변수가 포함되며 둘 다 Function 유형입니다. Promise 상태가 충족되면 then의 onfulfilled 메소드가 호출되고 Promise 상태가 거부되면 then의 onrejected 메소드가 호출되므로 비동기 작업 완료와 바인딩 처리 방법 사이에 경쟁이 없습니다.
기본적인 예를보십시오.
new Promise((resolve, reject) => {
console.log('code begin !');
let num = 4;
// 假装执行一个异步方法
setTimeout(() => {
console.log('async begin !');
num += 2;
// 把Promise状态设为fulfilled,并把结果传递出去
resolve(num);
// 把Promise状态设为rejected,并把失败信息传递出去
//reject('promise被手动中止');
// throw 'uncaught exception!'; // 这里要注意,catch无法捕获在异步方法里抛出的异常
}, 1000);
}).then((result) => { // 当Promise的状态被设为接受(fulfilled)时执行
console.log('fulfilled :' + result);
}, (reason) => { // 当Promise的状态被设为拒绝(rejected)时执行
console.log('rejected :' + reason);
}).catch((error) => {
console.log('error :' + error);
}).finally(() => {
// do something !
});
then 메서드는 Promise를 반환합니다. Promise의 성공과 실패를위한 콜백 함수는 최대 두 개의 매개 변수가 필요합니다.
catch 메서드는 실행 프로세스에서 예외가 발생하거나 Promise 상태가 실패 (거부 됨)로 설정되어 있고 거부 된 실행 기능이 설정되지 않은 경우에 실행됩니다. 또한 catch는 비동기 메서드에서 throw 된 예외를 catch 할 수 없습니다.
finally 메소드는 promise의 최종 상태를 알 수 없으므로 finally 콜백 함수는 매개 변수를받지 않으며 최종 결과에 관계없이 실행시에만 사용됩니다.
또한 Promise를 체인으로 호출 할 수 있으며 then 메서드의 실행이 종료되고 새로운 Promise가 반환되면 then 메서드가 순차적으로 실행됩니다. 그러나 여기에 한 가지주의 할 점이 있습니다 . 콜 체인에서 예외가 발생하거나 상태가 거부 됨으로 변경되면 나머지 콜 체인은 실행되지 않습니다. 따라서 체인 호출을 사용할 때주의하십시오!
코드 예 :
new Promise((resolve, reject) => {
console.log('code begin !');
let num = 4;
setTimeout(() => {
console.log('num + 2 = 6');
num += 2;
resolve(num);
}, 1000);
}).then((num) => {
return new Promise((resolve, reject) => {
console.log('num * num = 36');
setTimeout(() => {
num *= num;
resolve(num);
}, 1000);
});
}).then((num) => {
return new Promise((resolve, reject) => {
console.log('num + num = 72');
setTimeout(() => {
num += num;
resolve(num);
}, 1000);
});
}).then((result) => {
console.log('fulfilled :' + result);
}, (reason) => {
console.log('rejected :' + reason);
}).catch((error) => {
console.log('error :' + error);
}).finally(() => {
// do something !
});
Promise에는 Promise.all ( iterable ) 과 같은 다른 메소드가 있습니다. iterable (배열과 유사)을 전달할 수 있으며, iterable의 모든 promise가 실행될 때까지 기다렸다가 균일하게 반환됩니다. 반환 된 결과도 다음과 같습니다. 뒤에 오는 배열 매개 변수 내의 promise의 순서는 promise가 호출되는 순서에 의해 결정되지 않습니다.
Promise.all([mothod1(), mothod2()])
.then((result) => {
console.log('all complete');
console.log(result);
});
function mothod1() {
console.log('first mothod');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('mothod1 complete');
}, 2000);
});
}
function mothod2() {
console.log('second mothod');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('mothod2 complete');
}, 1000);
});
}
Promise.race ( iterable ) : iterable (배열과 유사)을 전달할 수 있습니다. iterable의 promise가 해결되거나 거부되면 promise가 해결되거나 거부됩니다.
Promise.race([mothod1(), mothod2()])
.then((result) => {
console.log(result);
console.log('complete');
});