node.js - Iterating with Q -


i have collection in mongodb (i'm omitting _ids brevity):

test> db.entries.find(); {   "val": 1 } {   "val": 2 } {   "val": 3 } {   "val": 4 } {   "val": 5 } 

i need perform processing on each document cannot db.update(). so, in nutshell, need retrieving 1 document @ time, process in node , save mongo.

i'm using monk library, , q promises. here's i've done — didn't include processing/save bit brevity:

var q = require('q');  var db = require('monk')('localhost/test'); var entries = db.get('entries');  var = 1; var total;  var f = function (entry) {     console.log('i = ' + i);     console.log(entry.val);     i++;     if (i <= total) {         var promise = entries.findone({ val: });         loop.then(function (p) {             return f(p);         });         return promise;     } };  var loop = q.fcall(function () {      return entries.count({});  }).then(function (r) {      total = r;     return entries.findone({ val: });  }).then(f); 

i expect code print out:

i = 1 1 = 2 2 = 3 3 = 4 4 = 5 5 

but prints out:

i = 1 1 = 2 2 = 3 2 = 4 2 = 5 2 

what doing wrong?

in code, loop 1 , 1 promise. executed once. not function. inside f, loop.then(f) trigger f result of promise (it has been executed not executed again).

you want create several promises. looking should looks like:

var q = require('q');  var db = require('monk')('localhost/test'); var entries = db.get('entries');  var = 1; var total;  var f = function (entry) {     console.log('i = ' + i);     console.log(entry.val);     i++;     if (i <= total) {         // not sure why put entries.findone here (looks mistake,          // returned value isn't used) if need done         // before loop, must pipe before loop         return entries.findone({ val: }).then(loop);         // not pipe f again here, appended @ end of loop     } };  function loop(){     return q.fcall(function () {         return entries.count({});     }).then(function (r) {         total = r;         return entries.findone({ val: });     }).then(f); }  loop(); 

if interested, here nice article promises.


Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -