Promise 사용법 소개
1. 간단한 예:
function runAsuync(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log(" ")
resolve(" ");
},2000)
});
return p;
}
runAsuync().then(function(data){
console.log(data);
})
// runAsync() then ,then , ,
runAsync resolve 。 ,
2 , ;
Promise 구조 함수는 하나의 매개 변수(함수)를 수신하고 두 개의 매개 변수를 전송할 수 있습니다:resolve와reject는 각각 비동기 작업이 성공한 후의 리셋 함수와 비동기 작업이 실패한 후의 리셋 함수를 나타냅니다.
사실 이곳의 성공과 실패는 정확하게 묘사되지 않았다. 표준에 따르면
resolve: Promise 상태를 fullfiled로 설정합니다.
rejiect: Promise 상태를 rejected로 설정합니다.
참고: Promise를 사용할 때 일반적으로 함수에 배치하고 필요할 때 이 함수를 실행하면 됩니다 (왜냐하면 Promise는 스스로 실행하기 때문).
2. 체인식 조작의 용법
function s1(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log("s1 ");
resolve("s1 ");
},2000)
})
return p;
}
function s2(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log("s2 ");
resolve("s2 ");
},2000)
})
return p;
}
function s3(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log("s3 ");
resolve("s3 ");
},2000)
})
return p;
}
function s4(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log("s4 ");
resolve("s4 ");
},2000)
})
return p;
};
s1().then(function(data){
console.log(data);
return s2();
}).then(function(data){
console.log(data);
return s3();
}).then(function(data){
console.log(data);
return s4();
}).then(function(data){
console.log(data);
return "hello world";
}).then(function(data){
console.log(data);
return " , "
}).then(function(data){
console.log(data);
})
Promise의 정수는'상태'입니다. 상태를 유지하고 전달하는 방식으로 리셋 함수를 제때에 호출할 수 있습니다. 이것은 callback 함수를 전달하는 것보다 간단하고 유연합니다.
then 방법에서 Promise 대상이 아닌 데이터를 직접 리턴할 수 있습니다. 뒤에 있는 then에서 데이터를 받을 수 있습니다.
3. reject의 사용
reject의 역할은 Promise의 상태를rejected로 설정하는 것입니다. 그러면 then에서 실패한 리셋 함수를 포착할 수 있습니다.
function s1(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
// console.log("s1 ");
let num=Math.ceil(Math.random()*10);
if(num > 5){
resolve(num);
}else{
reject(" ");
}
},2000)
})
return p;
}
s1().then(
function(data){//
console.log("resolve");
console.log(data);
},
function(reason,data){//
console.log("reject");
console.log(reason,data);
}
)
4. catch의 사용법
역할1:reject의 리셋 수신
역할2:resolve 리셋을 실행할 때 오류가 발생하면catch 방법을 실행하고 컨트롤러에서 오류를 보고하지 않으며 프로그램이 실행을 멈추지 않으며catch에서 오류 원인을 출력합니다.try/catch 조합 문장과 비슷한 용법
function s(){
return new Promise(function(resolve,reject){
setTimeout(function(){
var num=Math.floor(Math.random()*10);
console.log(" num:"+num)
if(num<5){
resolve(num);
}else{
reject(' :'+num);
}
},2000);
})
}
s()
.then(
function(data){
console.log('resolve');
console.log(data);
console.log(w)
},
function(data){
console.log("reject");
console.log(data);
// console.log(w)
}
)
.catch(function(data){
console.log("catch reject");
console.log(data);
})
5. all, race의 사용
참고:
all: 모든 것을 실행합니다.
적용 가능한 장면:
일부 게임의 힘든 소재는 비교적 많은 응용 프로그램으로 웹 페이지를 열 때 그림, 플래시 및 각종 정적 파일 등 필요한 각종 자원을 미리 불러옵니다.모든 것을 불러온 후에 페이지를 초기화합니다.
race: 가장 빨리 실행하는 사람, 누가 빨리 뛰는지, 누가 빨리 실행하는지
적용 장면: 시간 초과 판단 등
function f1(){
return new Promise(function(resolve,reject){
setTimeout(function(){
let num=Math.floor(Math.random()*10);
if(true){
resolve('f1:'+num);
}else{
reject('f1 ');
}
},1000)
})
}
function f2(){
return new Promise(function(resolve,reject){
setTimeout(function(){
let num=Math.floor(Math.random()*10);
if(true){
resolve('f2:'+num);
}else{
reject('f2 ');
}
},2000)
})
}
function f3(){
return new Promise(function(resolve,reject){
setTimeout(function(){
let num=Math.floor(Math.random()*10);
if(true){
resolve('f3:'+num);
}else{
reject('f3 ');
}
},400)
})
}
// Promise
// .all([f1(),f2(),f3()])
// .then(function(results){
// console.log(results);// results ,
// })
Promise
.race([f1(),f2(),f3()])
.then(function(results){
console.log(results);//
})
race 응용 장면:
//
function requestImg(){
var p = new Promise(function(resolve, reject){
var img = new Image();
img.onload = function(){
resolve(img);
}
img.src = 'xxxxxx';
});
return p;
}
// ,
function timeout(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
reject(' ');
}, 5000);
});
return p;
}
Promise
.race([requestImg(), timeout()])
.then(function(results){
console.log(results);
})
.catch(function(reason){
console.log(reason);
});
requestImg 함수는 비동기적으로 그림을 요청합니다. 주소를'xxxxx'라고 썼기 때문에 요청할 수 없습니다.timeout 함수는 5초의 시간을 끄는 비동기적인 조작이다.우리는 이 두 개의 Promise 대상으로 돌아가는 함수를 레이스에 넣기 때문에 그들 둘은 경주를 할 것이다. 만약 5초 안에 그림이 성공하면 then 방법에 들어가서 정상적인 절차를 실행할 것이다.만약 5초 동안 그림이 성공적으로 돌아오지 않으면timeout이 이기면catch에 들어가서'그림 요청 시간 초과'메시지를 보냅니다.