1

我有一个简单的工作superagent/async瀑布请求,如下所示:

  request = require 'superagent'
  user = request.agent()
  async.waterfall [
    (cb)->
      user.post('http://localhost:3000/form').send(name: 'Bob').end(cb)
  ], (err, res)->
    console.log err
    console.log res

这成功打印了我的完整 http 响应,并且errundefined.

如果我通过额外的步骤执行完全相同的操作:

  request = require 'superagent'
  user = request.agent()
  async.waterfall [
    (cb)->
      user.post('http://localhost:3000/form').send(name: 'Bob').end(cb)
    (err, res)->
      # this is never reached
      cb()
  ], (err, res)->
    console.log err # this now prints out the response
    console.log res # this is undefined

err现在是回应。res未定义。这是superagent我在这里遇到的问题,还是我只是不正确地使用async's waterfall

4

2 回答 2

1

这是他们如何选择处理作为回调传递的函数的 SuperAgent “问题”。如果该函数需要length 属性报告的恰好两个参数,那么“传统”errres就像 Async 想要的那样给出。如果您传递的函数没有报告其长度为 2,那么给出的第一个参数是res. 这是SuperAgent 处理回调的源代码

Request.prototype.callback = function(err, res){
  var fn = this._callback;
  if (2 == fn.length) return fn(err, res);
  if (err) return this.emit('error', err);
  fn(res);
};

为了保证您的回调按预期调用,我建议传递一个匿名函数,end以便它明确地将其长度报告为两个,这样您就可以将任何错误传递给您的回调。

request = require 'superagent'
user = request.agent()
async.waterfall [
  (cb) ->
    user.post('http://localhost:3000/form').send(name: 'Bob').end (err, res) ->
      cb err, res
  (err, res) ->
    # err should be undefined if the request is successful
    # res should be the response
    cb null, res
], (err, res) ->
  console.log err # this should now be null
  console.log res # this should now be the response
于 2014-05-13T00:40:33.343 回答
1

异步瀑布将错误直接传递给它的回调。数组中的第二个函数只接收一个参数 - res。并且数组中的每个函数都应该有自己的回调作为最后一个参数。如果发生错误,您应该在瀑布的回调中捕获。尝试:

async.waterfall([
  function(cb){
    superagent...end(cb);
  },
  function(res, cb){ //Note cb here.
    //If you don't pass res here, waterfall's callback will not receive it
    cb(null, res); 
  }], function(err, res){
    //If superagent fails you should catch err here
    should.not.exist(err);
    //res is defined because you passed it to callback of the second function
    should.exist(res); 
 });
于 2014-05-03T09:12:42.140 回答