将数据注入异步回调(使用 node.js)
Injecting data into asynchronous callbacks (with node.js)
我试图围绕如何使异步编程工作。
在我当前的用例中,我有每秒可能被多次调用的函数,并且它们的回调依赖于多个变量,这些变量可能在它们之间发生变化。
一个简化的例子:(为了简洁起见,使用咖啡脚本)
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黑客,根本不起作用。
顺便说一句,我试图使用 caolan/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?
});
}
它仍然给我留下同样的问题。那么我该怎么做呢?
谢谢你的时间。
将action
对象内容与action
值本身分开。也就是说,内存中有一些对象,在此特定上下文中由action
名称引用。
例如
function test(action) {
alert("Test1: " + action.value);
setTimeout(function () { alert("Test2: " + action.value); }, 1000);
}
var action = { value: 1; };
test(action);
action = { value: 2 };
alert("Action value outside: " + action.value);
将提醒"测试1:1"、"操作值外:2"和"测试1:1"。但是,一旦将action = { value: 2 };
替换为 action.value = 2
,最后一个警报将更改为"Test1:2"。
因此,如果您的问题是操作对象的某些字段在外部更改,只需将其克隆到doSomething的第一行即可。如果您的问题是对对象的引用在外部更改,则不必担心,它不会以任何方式影响您的doSomething
。
此外,对 doSomething 的后续调用不会"覆盖"回调中 action 参数的值,因为它在特定调用上关闭:en.wikipedia.org/wiki/Closure_(computer_science)
例如
function test(action) {
alert("Test1: " + action.value);
setTimeout(function () { alert("Test2: " + action.value); }, 1000);
}
var action = { value: 1; };
test(action);
action = { value: 2 };
test(action);
将提醒
我不确定使用 CS 是否真的对这个例子有帮助,让我用普通的 JS 来表达它:
var doSomething = function (requestor, thing, action, callback) {
thing.takeAction(action, function (result) {
requestor.report(result);
callback(result);
});
};
// Following is completely safe:
doSomething(r1, t1, a1, c1);
doSomething(r2, t2, a2, c2);
doSomething(r3, t3, a3, c3);
每次调用 doSomething 时,都会创建新的函数作用域。因此,在内部,创建并传递给takeAction的函数可以访问最初调用doSomething的参数(另一个调用doSomething不会改变这一点!这就是JavaScript中范围界定
- 如何使用 node.js 比较两个 json 数组
- 如何使用Node.js最有效地解析网页
- 使用node.js制作网站
- 使用node.js服务器中的evernote api获取note内容
- 有没有任何方法可以使用node-js从不同的机器打开浏览器
- 如何使用 Node JS 获取 JSON 嵌套数组值
- 如何使用Node/Express显示有关特定错误的自定义html页面
- 如何使用Node.js脚本从Rally获取用户的修订历史
- 使用Node使用Dropbox API上传到个人帐户
- 如何在不重新加载的情况下提交表单,并使用Node+Express将数据传递回同一页面
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 使用Node.js将HTML存储在browserDB中
- 使用Node.js在应用程序引擎上进行本地单元测试
- 使用application/x-www-form-urlencoded使用node.js在post请求中发送数组
- 尝试使用Node.js动态路由从IMDB中抓取电影内容.但是在我的output.json文件中没有定义
- 使用Node js和D3实时绘制地图上的国家名称
- 使用Node/Express随机查询Postgresql表并处理行数据
- 使用node.js中的windows 1252对字符串进行编码
- 使用node-js上传文件,并将表单信息存储在数据库(mysql)中
- 我应该如何使用node.js和导出来调用mysql数据库