Last active
February 25, 2018 19:03
-
-
Save dhensen/f8efaeb986df8e09a513baee8877b195 to your computer and use it in GitHub Desktop.
This retries, but the timeout only cancels the outer promise while the inner promise continues again and again.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Fake createOrder. It fails half of the time and had a random runtime between 0 and 1000 ms. | |
*/ | |
async function createOrder() { | |
return new Promise((resolve, reject) => { | |
let action; | |
let returns; | |
if (Math.random() < 0.01) { | |
console.log('action=resolve'); | |
action = resolve; | |
returns = 'success'; | |
} else { | |
console.log('action=reject'); | |
action = reject; | |
returns = 'failure'; | |
} | |
var runtime = Math.random() * 1000; | |
runtime = 1000; | |
console.log('createOrder runtime: ' + runtime.toFixed(0) + ' ms'); | |
setTimeout(action, runtime, returns); | |
}); | |
} | |
/** | |
* | |
* @callback createOrder~callback | |
* @param {number} timeout | |
*/ | |
async function retryOrCancel(promiseGenerator, timeout) { | |
return new Promise(async (resolve, reject) => { | |
const result = promiseGenerator(); | |
console.log('right after promiseGenerator'); | |
const timeoutObj = setTimeout( | |
(reject, innerPromise) => { | |
console.log('TIMEOUT REJECTION'); | |
console.log(innerPromise); | |
reject('timeout'); | |
}, | |
timeout, | |
reject, | |
result | |
); | |
return result | |
.then(_ => { | |
console.log('CLEAR TIMEOUT'); | |
clearTimeout(timeoutObj); | |
resolve(_); | |
}) | |
.catch(err => { | |
console.log('BEFORE call to AGAIN'); | |
again(promiseGenerator); | |
}); | |
}); | |
} | |
async function again(promiseGenerator) { | |
return new Promise(async resolve => { | |
return promiseGenerator() | |
.then(res => { | |
resolve(res); | |
}) | |
.catch(err => { | |
console.error('failed because of ' + err); | |
console.error('retrying...'); | |
return again(promiseGenerator); | |
}); | |
}); | |
} | |
/** | |
* Wrap retryOrCancel in a handler with a catch. | |
* The createOrder is going to be executed with a 500 ms timeout. | |
* The total time createOrder is going to take is between 0 and 1000 ms, so expect timeouts to occur. | |
*/ | |
(async function() { | |
const handler = async promise => { | |
return await promise.catch(err => { | |
console.log('catched because of: ' + err); | |
}); | |
}; | |
// await handler(retryOrCancel(createOrder, 500)); | |
// await handler(retryOrCancel(createOrder, 500)); | |
await handler(retryOrCancel(createOrder, 5000)); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment