我正在努力思考如何使异步编程工作。
在我当前的用例中,我的函数可能每秒被调用多次,并且它们具有依赖于多个变量的回调,这些变量可能在它们之间发生变化。
一个简化的例子:(为简洁起见使用coffeescript)
doSomething = (requestor, thing, action, callback) ->
thing.takeAction action, (result) ->
# actually a lot of times this nests down even further
requestor.report result
callback result
如果在 thing.takeAction 返回其结果之前使用不同的数据多次调用 doSomething,我认为我不能依赖请求者和回调仍然是我需要的相同的东西。正确的?
为了避免这种情况,我需要以某种方式将请求者和回调注入到 takeAction 的回调中。这有可能吗?
我想到了做类似的事情
doSomething = (requestor, thing, action, callback) ->
thing.takeAction action, (result, _requestor = requestor, _callback = callback) ->
_requestor.report result
_callback result
但这当然只是一个 CoffeeScript hack,根本不起作用。
顺便说一句,我试图使用 caolan/async 模块来帮助我解决这个问题,但事实仍然是,我在回调中经常需要比 async 提供的变量更多的变量。像:
doSomething = function(requestor, thing, action, callback) {
// this might not need a waterfall, but imagine it would have nested further
async.waterfall(
[
function(next) {
thing.takeAction(action, function(result) {
// How can I know that action is still the same?
next(null, result);
});
},
function(result, next) {
requestor.report(result); // requestor still the same?
next(null, result);
}
],
function(err, result) {
callback(result); // callback still the same?
});
}
它仍然给我留下同样的问题。那么我该怎么做呢?
感谢您的时间。