【问题标题】:Conditional async function条件异步函数
【发布时间】:2016-12-17 11:11:29
【问题描述】:

我的功能是从 Gmail 接收电子邮件。我想运行这个函数 n 次或直到找到一封电子邮件。

什么是正确的方法?我试过了:http://caolan.github.io/async/docs.html#retry 但没有成功。

我正在关注这篇文章如何阅读电子邮件:https://developers.google.com/gmail/api/quickstart/nodejs

【问题讨论】:

标签: javascript node.js asynchronous gmail


【解决方案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)

【讨论】:

  • 不幸的是我的函数没有返回一个承诺。我想递归是要走的路?
  • @dzvert 使用上面的解决方案,但使用回调,或者将 API 包装为返回承诺的函数 (link)
  • @samsonthehero 我已经尝试过了,但是出现“then is not a function”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多