我正在尝试使用网络抓取工具从某些网站获取产品以减少我的内存使用量(我在某处找不到内存泄漏)。所以我试图异步地向一个回调发送参数,以便终止当前的上下文。
这就是我所在的地方:
var big = html.get(url);
callback(big);
big = null; // this isn't going to get erased until after big is done is it?
这是我尝试过的:
var big = html.get(url);
process.nextTick(function() {callback(big)}); // this seems wrong to me.
big = null;
答案 0 :(得分:12)
var big = html.get(url);
process.nextTick(function() {callback(big); big = null; });
如果这种风格对您来说不明显,那么您应该再学习closures。
(顺便说一下,在这里可能不需要将big设置为null;一旦回调结束,big就超出了范围。)
编辑:为了纪念这个问题六周年,这里有一个同样的ECMA-6版本:
const big = html.get(url);
process.nextTick(() => callback(big));
答案 1 :(得分:12)
process.nextTick() doesn't support passing arguments like setTimeout() does.您只需要创建一个传递参数的函数。
所以而不是:
setTimeout(myfunc, 0, 'arg1', 'arg2')
使用此:
process.nextTick(function() { myfunc('arg1', 'arg2') })
您还可以使用函数来构建函数。
最后,setTimeout不支持指定调用该函数的对象,因此它的用途有限。
答案 2 :(得分:2)
虽然process.nextTick()不直接支持传递参数,但是有一条快捷方式可以实现相同的功能。
var big = html.get(url);
process.nextTick(callback.bind(null, big));
请注意,这与已经给出的显式闭包答案在功能上没有任何区别(减去手动设置big = null;
而不是让它自己超出范围),但我觉得它使代码变得有点更容易阅读。
bind()
实际上是一个比这里显示的更强大的工具;在the MDN documentation阅读更多内容(包括一些示例)。
详细信息:bind()
的第一个参数是this
执行期间分配给callback()
的值,此值已分配给null
,因为它看起来像big
喜欢在这种情况下不会使用它。任何其他参数(在这种情况下仅callback
)将通过称为“部分函数应用程序”的技术在稍后调用时作为参数传递给{{1}}。