github.com/Sunny-117/j…
链式调用
function arrang(name){
const task = [];
task.push(() => {
console.log(`${name} is notified`);
})
function wait(time){
task.push(() => {
new Promise(resolve => {
setTimeout(() => resolve, time * 1000)
})
console.log(`等待${time}秒-`)
})
return this;
}
function doSomething(taskName){
task.push(() => {
console.log(`start to ${taskName}`)
})
return this;
}
function waitFirst(time){
task.unshift(() => {
new Promise(resolve => {
setTimeout(() => resolve, time * 1000)
})
console.log(`等待${time}秒`)
})
return this;
}
async function execute() {
for(let t of task){
await t();
}
return this;
}
return {
wait,
do: doSomething,
waitFirst,
execute
}
}
arrange('aaa')
.wait(5)
.do('commit')
.execute();
Promise.retry
Promise._retry = function (fn, time, delay) {
let count = 0
return new Promise((resolve, reject) => {
function retry () {
fn().then(res => {
resolve(res)
}, error => {
count++
if (count < time) {
setTimeout(() => {
console.log(`第${count}/${time}次请求`)
retry()
}, delay)
} else {
reject(new Error(`请求失败,以尝试${count}次`))
}
})
}
retry()
})
}
const asyncOperation = () => {
const random = Math.random();
if (random < 0.3) {
return Promise.resolve('Operation succeeded');
} else {
return Promise.reject(new Error('Operation failed'));
}
};
Promise._retry(asyncOperation, 3, 2000)
.then((result) => {
console.log(result);
})
.catch((error) => {
console.error(error.message);
});