2016-12-17 4 views
0

У меня есть функция получения электронной почты от Gmail. Я хочу запустить эту функцию n раз или до тех пор, пока не будет найдено электронное письмо.Условная асинхронная функция

Что это за правильный способ? Я пробовал: http://caolan.github.io/async/docs.html#retry, но безуспешно.

Я следовал этой статье, как читать сообщения электронной почты: https://developers.google.com/gmail/api/quickstart/nodejs

+0

https://en.wikipedia.org/wiki/Recursion_(computer_science)? – smnbbrv

+0

Можете ли вы опубликовать то, что вы пробовали? – Ben

+0

Возвращает ли функция Promise или получает обратный вызов? – samsonthehero

ответ

1

Если у вас есть рутина под названием 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) ,

+0

, к сожалению, моя функция не возвращает обещание. Думаю, рекурсия - это путь? – dzvert

+0

@dzvert использовать вышеуказанное решение, но использовать обратный вызов или обернуть API как функцию, которая возвращает обещание ([link] (http://stackoverflow.com/questions/22519784/how-do-i-convert-an -existing-callback-api-to-promises)) – samsonthehero

+0

@samsonthehero Я уже пробовал это, но ошибка «тогда не является функцией». – dzvert