2016-11-10 13 views
-1

私はそれがNodeJSに思えるかなり単純な何かをしようとしている - 私は、一度に一つの機能を実行したいです。これらの関数にはすべてコールバックがあります。私は以下の私のコードと、彼らがさらに参照するために実行する関数の概要を述べました。一度に1が、第三の反復は、単に最初の二つの機能を無視して、とにかく行く -実行機能(MongoDBの操作/ Async.js)は

私の問題は、最初の二つは絶対に正常に動作していることです。私のプログラムはオブジェクトをデータベースに入れて動作し、重複するオブジェクトを引き起こしているので、これは本当の問題を引き起こしています。

全体の目標は、各機能を一度に1つずつ実行させることです。私はここに欠けているものはありますか?あなたの助けをありがとう!

以下の機能では、私が読みやすいよう、すべてのパラメータに「引数」を簡略化していることに注意してください。

関数を呼び出す:関数内

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); 
     }); 
    }); 
} 

これはasync.series(で動作するように統合されloopThroughDetailsを()、)を呼び出します:

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を使用します:

私はここで間違っていますか?何か助けてくれてありがとう! :)

+0

明示的にaddNewProjectメソッドを呼び出す理由はありますか?ループや繰り返しのような反復的なプロセスで一度に呼び出すことはできますか?たとえば、追加するプロジェクトが1つまたは2つしかない場合はどうなりますか? –

答えて

-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

ご協力いただきありがとうございます!この簡単な説明は私の週をちょうど作った! :)これを5日間しゃべっていた。誰かがこの完璧な答えをdownvoted理由:( –

+0

あなたは歓迎されていることを確認!一部の人々は単なる自己陶酔していると他の人を気にしないでください。ここでの目的は、いつ、どこですることができます支援することではありません。あなたは、常に最も文法的に正しく取得できない場合がありますその答えが、時にはシンプルなコンセプトを助けることができる。人々はすでに専門家であることを期待しているようです。 –

+0

が合意した!私は答えはすでにここだから、人々は今それをdownvotingていることは問題ではないと思います:) –

関連する問題