我有一个简单的工作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响应,并且
err
是undefined
。如果我执行额外的步骤执行完全相同的操作:
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
的waterfall
? 最佳答案
这是SuperAgent的“问题”,它们如何选择处理作为回调传递的功能。如果该函数恰好期望length property所报告的两个参数,则“传统” err
和res
会像Async一样给出。如果您传递的函数未报告其长度为2,则给定的第一个参数为res
。这是SuperAgent's source for handling callbacks:
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
,以便它明确将其长度报告为2,这样您就可以将任何错误传递给回调。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
关于node.js - Superagent在异步 waterfall 中移动响应回调位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23440922/