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会保留一个指向这个作用域的指针(这就是所谓的闭包)。