Promise应用
Promise.race([fetchPromise(2000), delayPromise(1000)]);
function delayPromise(time) {
return new Promise((resolve, reject) => {
setTimeout(function() {
reject(new Error('timeout'));
}, time);
})
};
function fetchPromise(delay) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('request'), delay)
})
};
let timeout = 3000,
reqestTime = 2000,
animateTime = 1000;
function animatePromise(animateTime) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('animate')
}, animateTime);
})
}
console.log('start')
Promise.all([
Promise.race([fetchPromise(reqestTime), delayPromise(timeout)]),
animatePromise(animateTime)
]).then(data => {
console.log('data => ', data)
console.log('stop')
}).catch(e => {
console.log(e)
});
class CancelPromise {
constructor() {
this.pending = null;
this.reject = null;
}
request(fetch) {
if (this.pending) {
console.log('请求未结束')
this.cancel()
} else {
console.log('aaaaaaaaaa')
};
this.pending = Promise.race([
fetch,
new Promise((resolve, reject) => {
this.reject = reject
})
]);
return this.pending;
}
cancel() {
this.reject('取消请求');
this.pending = null;
}
}
let cancelPro = new CancelPromise()
cancelPro.request(fetchPromise(1000)).then(res => console.log(res)).catch(e => console.log(e))
function multiReq(urls = [], max) {
function fetchPromise(url) {
return () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('request' + url), 3000)
})
}
};
let fetchs = [];
for (let i = 0; i < urls.length; i++) {
fetchs.push(fetchPromise(urls[i]))
};
let res = [],
num = 0;
function addReq() {
let func = fetchs.shift()
func().then(data => {
console.log(data)
res.push(data);
console.log(res.length, fetchs.length)
if (fetchs.length > 0) {
addReq();
};
console.log(res.length, urls.length)
});
}
while (num < max) {
console.log(num)
num++;
addReq();
}
}