// 需要递归的函数
const recallPromise = function (randomNumber, times) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const result = Math.ceil(Math.random() * randomNumber)
resolve(result)
}, 500)
}).then(res => {
// 此处接收的res是上面resolve的result,
// 判断结果是否大于30,大于就停止递归,不大于的话,就继续乘以2
console.log("response value:" + res)
if (res < 1) {
console.log('respnose success:' + res)
return Promise.resolve(res)
} else {
if (times > 0) {
console.log('respnose fail:' + res)
console.log('retry:' + times)
times--
return recallPromise(res, times)
} else {
return Promise.resolve(false)
}
}
})
}
// 在aa方法中调用递归的promise函数
const aa = async function () {
console.log('before')
const res = await recallPromise(100, 10) // 等待promise的递归结束,才进行下面的代码
console.log('res:' + res)
console.log('afger')
}
// log = console.log
//sleep
function sleep(delay){
console.log('wait:' + delay)
return new Promise(resolve => setTimeout(resolve,delay))
}
//模拟请求response
function response(randomNumber) {
return new Promise((resolve, reject) => {
setTimeout(() => {
var num = Math.ceil(Math.random() * randomNumber)
console.log("reponse data:" + num)
resolve(num)
}, 500)
})
}
//模拟请求response retry
async function retryResponse(randomNumber, times ,delay) {
var num = await response(randomNumber)
if (num <= 1) {
console.log('response success:' + num)
return num
} else {
if (times == 0) {
console.log( "lase times=" + times)
return false
} else {
console.log('response error:' + times + 'th.retry')
times--
await sleep(delay)
return retryResponse(randomNumber, times, delay)
}
}
}
async function getResponse() {
// await aa()
var data = await retryResponse(100, 5, 1000)
console.log('last data:' +data)
// return data
}
getResponse()