NodeJScallback范围
作为一名js / node新手,我在理解如何解决这个问题方面遇到了一些问题。
基本上我有一个我想保存到MongoDB数据库的对象列表,如果它们不存在的话。
这里是一些代码:
var getDataHandler = function (err, resp, body) { var data = JSON.parse(body); for (var i=0; i < data.length; i++) { var item = data[i]; models.Entry.findOne({id: item.id}, function(err, res) { if (err) { } else if (result === null) { var entry = new models.Entry(item); feedbackEntry.save(function(err, result) { if (err) {} }); } }); } }
我new models.Entry(item)
的问题是,因为它是asynchronous的,一旦new models.Entry(item)
行被执行,item的值将等于数据数组中最后一个元素的每一个callback。
我可以用什么样的模式来避免这个问题?
谢谢。
有两种模式可用:
1)callback。 那就是你继续从函数中调用函数,把它们作为parameter passing。 callback通常很好,但是在处理数据库或其他asynchronous资源时,尤其是服务器端,您可以在“callback地狱”中快速结束,而且您可能厌倦了寻找技巧来减less代码的缩进级别。 你有时会想知道你是如何处理exception的。 但callback是基础:您必须了解如何使用callback来处理这个问题。
2) 承诺 。 使用承诺你可能有这样的事情(例如从我的相关博客文章 ):
db.on(userId) // get a connection from the pool .then(db.getUser) // use it to issue an asynchronous query .then(function(user){ // then, with the result of the query ui.showUser(user); // do something }).finally(db.off); // and return the connection to the pool
而不是将下一个函数作为callback函数传递,你只需要使用这个函数进行链接(实际上它有点复杂,还有其他函数,例如处理集合和并行parsing或者以干净的方式捕获错误)。
关于调用callback之前variables演变的范围问题,标准的解决scheme是这样的:
for (var i=0; i<n; i++) { (function(i){ // any function defined here (a callback) will use the value of i fixed when iterating })(i); });
这是有效的,因为调用一个函数会创build一个作用域,并且你在该作用域中创build的callback会保留一个指向这个作用域的指针(这就是所谓的闭包)。