Вы уже используете async
функции, и все уже выглядит на основе Promise, так что вы можете сделать hardWork
async
и затем await
каждое Promise внутри него. Если окончательное задание не выполнено, отклоните. В вызывающем hardWork
, если Обещание в конечном итоге отклоняется, установите тайм-аут, чтобы вызвать его снова через 5 минут, в противном случае все готово:
const hardWork = async () => {
// I assume this next line was psuedo-code for an API call or something
await `https:${screenshot.thumURL}`;
const image = await downloadImage.downloadImage();
await UploadToGcBucket.UploadToGcBucket(image);
await timeout(5000);
const button = await googleVisionAPI.findMagicButton(`some_screenshot.jpg`);
if (button === -1) {
throw new Error();
}
// success
};
const tryWork = () => {
hardWork()
.catch((error) => {
setTimeout(tryWork, 5 * 60 * 1000); // 5 minutes
});
};
tryWork();
Если вам нужны разные сообщения об ошибках для различных возможных ошибки, я бы сделал функцию более высокого порядка, которую вы можете передать в .catch
, которая регистрирует сообщение, чтобы сохранить код DRY:
const makeCatch = msg => (err) => {
console.log('Problem with ' + msg, err);
throw new Error(); // this is important- this rejects the Promise, so it stops the hardWork
};
// ...
await downloadImage.downloadImage()
.catch(makeCatch('downloadImage'));
await UploadToGcBucket.UploadToGcBucket(image)
.catch(makeCatch('upload to gc'));
await timeout(5000);
const button = await googleVisionAPI.findMagicButton(`some_screenshot.jpg`)
.catch(makeCatch('findButton'));
Живой фрагмент:
// dummied up API calls below...
const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));
const downloadImage = () => new Promise(resolve => setTimeout(resolve, 200));
const uploadToGcBucket = () => new Promise(resolve => setTimeout(resolve, 200));
// the below function will resolve to -1 70% of the time, and to 0 30% of the time
const findMagicButton = () => new Promise(resolve => setTimeout(resolve, 200, Math.floor(Math.random() - 0.7)));
// dummied up API calls above...
const hardWork = async () => {
const image = await downloadImage();
await uploadToGcBucket(image);
await timeout(500);
const button = await findMagicButton(`some_screenshot.jpg`);
if (button === -1) {
throw new Error();
}
console.log('success');
};
const tryWork = () => {
hardWork()
.catch((error) => {
console.log('failure, retry');
setTimeout(tryWork, 2 * 1000); // 2 seconds
});
};
console.log('start');
tryWork();