프런트엔드 비동기 솔루션 - 4.2(generator+promise)
//
function request() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
let num = Math.random();
if (num > 0.9) {
reject(num + "request err")
} else {
resolve(num * 100);
}
}, 100)
})
}
let it = gen();
let p = it.next().value;// yield Promise p
p.then(res => it.next(res).value, err => it.throw(err));// , (gen)
function* gen() {
try {
let response = yield request();
console.log(response.text);
} catch (error) {
console.log('Ooops, ', error.message); // Promise !}}
}
}
여기서 리퀘스트의 작법은 일반적인 Promise 비동기적인 작법이다.gen에서 비동기적인 작법은 이미 매우 동기화되었다. 유일한 단점은 중간에 있는 이 코드가 우리가 여러 번 비동기적일 때 우리는 끊임없이 연장해야 한다는 것이다.
function request(){
// ,
}
let it = gen();
let p = it.next().value;
// res it.next(res).value, promise , promise.then()
p.then(res => it.next(res).value, err => it.throw(err))
.then(res => it.next(res).value, err => it.throw(err));
function* gen() {
try {
let response = yield request();
console.log(response);
let response2 = yield request();
console.log(response,response2);
} catch (error) {
console.error('Ooops', error); // Promise !}}
}
}
이렇게 하면 아름답지 않겠습니까? 어쨌든 계속 중복된 코드를 써야 합니다.그래서 우리는generator가 자동으로 달리는 것을 보조하는 함수를 하나 더 쓴다.
//generator , generator yield promise
let genRun = function () {
function run(p, gen) {
p.then(resolve => {
p = gen.next(resolve).value;
if (p !== undefined) {
run(p, gen)
}
}, reject => {
p = gen.throw(reject).value;
})
}
return function (generator) {
let g = generator();
run(g.next().value, g)
}
}();
function request() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
let num = Math.random();
if (num > 0.8) {
reject(num + "request err")
} else {
resolve(num * 100);
}
}, 100)
})
}
genRun(function* () {
try {
let response1 = yield request();
console.log("response1", response1);
let response2 = yield request();
console.log("response2", response2);
let response3 = yield request();
console.log("response3", response3);
} catch (e) {
console.error(e)
}
});
이렇게 하면 우리가 request가 되돌아오는 것을 보증하기만 하면 된다
Primise
대상은 우리의 비동기 코드를 이상하게 쉽게 쓸 수 있다.이 글은 설명된 주석이 많지 않다. 주로 요 며칠 동안 너무 피곤했기 때문이다. 나중에 시간이 나면 다시 돌아와서 이해를 보조하는 주석을 보충하고 관나리께서 저에게 계속 쓸 수 있도록 칭찬과 격려를 해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
101 시리즈: 프라미스 #2: 현재 프라미스 상태를 얻고 자신만의 프라미스 큐를 만드는 방법?더 복잡한 주제에 도달하기 전에 Promise 위에 만들 수 있는 도구와 유틸리티 기능에 대해 생각해 볼 것을 제안합니다. 이 기사에서는 현재 약속 상태를 가져오고 약속 대기열을 만드는 방법에 대해 생각해 보겠습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.