2016-11-10 25 views
-1

我试图做一些相当简单的事情,它似乎在NodeJS中 - 我想一次运行一个函数。所有这些功能都有回调。我在下面概述了我的代码,以及它们运行的​​功能以供进一步参考。在NodeJS中同步运行函数(MongoDB操作/ Async.js)

我的问题是,前两个工作是绝对正常的 - 一次一个,但第三次迭代只是忽略了前两个功能,只是无论如何。这导致了一个真正的问题,因为我的程序在将对象放入数据库中工作,并导致重复的对象。

总体目标是简单地让每个功能一次运行一个。有什么我在这里失踪?非常感谢你的帮助!

请注意,在下面的函数中,我将所有参数简化为“参数”以便于阅读。

调用功能:

addNewProject(args); 
addNewProject(args); 
addNewProject(args); 

里面的功能,运行此:

function addNewProject(args) { 
    var info = args; 
    queue.push(function (done) { 
     loopThroughDetails(info, projID, 0, function() { 
      console.log('complete'); 
      done(null, true); 
     }); 
    }); 
} 

这就要求loopThroughDetails(),这是一个整合与async.series()工作:

function loopThroughDetails(info, projID, i, callback) { 
    if (i < 500) { 
     getProjectDetails(projID + "-" + i, function (finished) { 
      if (JSON.stringify(finished) == "[]") { 
       info.ProjID = projID + "-" + i; 
       DB_COLLECTION_NAME.insert(info, function (err, result) { 
        assert.equal(err, null); 
        callback(); 
       }); 
      } else { 
       i++; 
       loopThroughDetails(info, projID, i, callback); 
      } 
     }); 

    } 
} 

调用完所有这些之后,我只需使用async.series来完成任务:

async.series(queue, function() { 
    console.log('all done'); 
}); 

我在这里做错了什么?非常感谢您给予的任何帮助! :)

+0

是否有你明确调用addNewProject方法的原因?它们可以通过像循环一样的迭代过程一次被调用一个...例如,如果您只添加了一个或两个项目,该怎么办? –

回答

-1

首先,有很多方法来实现你在找什么,大部分是主观的。如果可能,在同步迭代时我喜欢使用array.shift方法。这个概念是这样的。

// say you have an array of projects you need to add. 
var arrayOfProjects = [{name: "project1"}, {name: "project2"}, {name: "project3"}]; 

// This takes the first project off of the array and assigns it to "next" leaving the remaining items on the array. 

var nextProject = function (array) { 

    // if there are items left then do work. Otherwise done. 
    if (array.length > 0) { 
     // shift the item off of the array and onto "next" 
     var next = array.shift(); 

     addNewProject(next); 

    } 

} 
var addNewProject = function (project) { 
    // Do stuff with the project 
    console.log("project name: ", project.name); 
    // When complete start over 
    nextProject(arrayOfProjects); 
} 

// Start the process 
nextProject(arrayOfProjects); 

Here is a working Example

,如果你检查的页面,你会看到记录到控制台,以便项目。

+0

非常感谢您的帮助!这个简单的解释只是让我的一周! :)已经摆弄了五天。不知道为什么有人低估了这个完美的答案:( –

+0

不客气!有些人只是自恋,不关心别人,这里的目标是帮助你在什么时间和地点,你可能不会总是得到最正确的语法正确答案但有时候一个简单的概念可以提供帮助,看起来人们期望你已经成为一名专家 –

+0

同意!我想现在人们都在下调它并不重要,因为答案已经在这里:) –