如何确保正确的parameter passing给循环中声明的函数调用?
我是新来的节点,但我已经喜欢它了。 唯一的问题是,asynchronousfunction正在杀死我。
我正在使用谷歌包来获得我的网站在谷歌的排名如此:
for (var j=0;j<keywords.length;j++) { var keyword = keywords[j]; google(keyword, function(err, next, links) { console.log('Searching for keyword "' + keyword + '" in google.' + google.tld + ' ('+ google.lang +')'); if (err) console.error(err); for (var i = 0; i < links.length; ++i) { var rank = i+1; console.log(keyword + ' #'+ rank + ' - ' + links[i].link + ' | ' + links[i].title); //link.href is an alias for link.link //console.log(links[i].description + "\n"); } console.log('\n'); }); }
我的问题是,控制台日志显示所有网站相同的关键字,虽然我已经在我的关键字数组中定义了三个。
我错过了什么?
这里直接的问题是,在调用callback之前, j
和keyword
variables会改变。
一个简单的解决scheme是在封闭中保护这个variables:
for (var j=0; j<keywords.length; j++) { (function(j){ var keyword = keywords[j]; ... })(j); }
当你只使用一个简单的数组时,你也可以通过forEach
使用闭包:
keywords.forEach(function(keyword, j){ ... });
为了处理这种asynchronous问题,你现在应该潜入承诺中,这样可以帮助你以更清晰的方式构build你的代码。 介绍 。
- ibm的watson-developer-cloud Node.js sdk的发现模块中的updateDocument api坚持一个文件参数
- 套接字 – 没有数据显示在客户端网站上
- 不能传递一个嵌套的对象res.render()?
- 使用Makefile构buildjavascript
- 节点JS浏览器模拟(cookies,会话,标题)
- Access-Control-Allow-Origin不允许源http:// localhost:3000
- 在forloop中的NodeJs console.table
- 使用JavaScript在mongoDb中查询
- 在Node.JS中parsingMicrosoft Office文件