没有外部库在Node中处理多个异步http请求的正确方法是什么?

时间:2016-10-12 16:48:05

标签: javascript node.js asynchronous

我正在使用一个API包装器,其端点在查询时只接受用户ID - 但是,有一个端点允许我按用户名搜索(包装器,searchByUsername,你将在下面看到)我写了跟随帮助函数在每个请求触发之前转换它们,为我们的用户提供灵活性:

  var convertToID = function (username, callback) {
    searchByUsername(username, function (error, response, body) {
      if (body.users[0]){
        callback(body.users[0].username)
      }
    })
  };

以下是我使用它的方式:

  this.relationship = function (user, query, callback) {
    if (isNaN(user)) {
      convertToID(user, function (ID) {
        get('/users/' + ID + '/relationships/?query=' + query, callback);
      })
    } else {
      get('/users/' + user + '/relationships/?query=' + query, callback);
    }
  }

这很好用,但将它放入我的每个包装器中显然是次优的。来自Ruby背景,我可以把它压缩成一行 - 但JS的异步性质有点扭曲我的大脑。我真正想要的是类似于:

var user = isNaN(user) ? convertUsernameToID(user) : user;
get('/users/' + user + '/relationships/?query='+query, callback);

我已经探索了其他答案(是的,我知道它们中有很多)re:async JS gotchas,但我必须遗漏一些东西。在过去的较大型项目中,我使用过异步软件包,但感觉有点过分了,我更喜欢这个。

1 个答案:

答案 0 :(得分:0)

您可以使用

function relationship(user, query, callback) {
  if (isNaN(user))
    convertToID(user, getById);
  else
    getById(user);

  function getById(ID) {
    get('/users/' + ID + '/relationships/?query=' + query, callback);
  }
}

如果您使用的是承诺,则变得更加简单,请参阅if-else flow in promise (bluebird)