Если у вас есть рутина под названием gmail
, которая возвращает обещание, которое успешно (отрабатывает), если письмо будет найдено, и в противном случае не удается (отклоняет), то :
function get(n) {
return gmail().catch(() => {
if (!n) throw "Too many tries!";
return get(--n);
};
}
Использование:
get(5).then(
mail => console.log(mail.body),
() => console.log("No mail!"));
Если по какой-то причине вам не нравится рекурсивный стиль:
function get(n) {
let promise = Promise.reject();
do { promise = promise.catch(gmail); } while (n--);
return promise;
}
Если gmail
является стиль обратного вызова, то
function get(n, cb) {
gmail(function(err, data) {
if (err)
if (!n) get(--n, cb);
else cb("Too many tries!");
else cb(null, data);
});
}
Или еще лучше, promisify gmail
, либо с использованием библиотеки или
function promisify(fn) {
return new Promise((resolve, reject) {
fn(function(data, err) {
if (err) reject(err);
else resolve(data);
});
});
}
, а затем заменить gmail
в первом растворе с promisify(gmail)
,
https://en.wikipedia.org/wiki/Recursion_(computer_science)? – smnbbrv
Можете ли вы опубликовать то, что вы пробовали? – Ben
Возвращает ли функция Promise или получает обратный вызов? – samsonthehero