2016-11-10 5 views
-1

Я пытаюсь сделать что-то довольно простое в NodeJS - я хочу запускать функции по одному за раз. Все эти функции имеют обратные вызовы. Я изложил свой код ниже, а также функцию, которую они запускают для дальнейшей справки.Выполнение синхронных операций в NodeJS (MongoDB Operations/Async.js)

Моя проблема в том, что первые два работают абсолютно нормально - по одному, но третья итерация просто игнорирует первые две функции и просто идет в любом случае. Это вызывает настоящую проблему, так как моя программа работает с помещением объектов в базу данных и вызывает дублирование объектов.

Общая цель состоит в том, чтобы каждая функция запускалась по одному за раз. Здесь что-то не хватает? Большое спасибо за Вашу помощь!

Обратите внимание, что в приведенных ниже функциях я упростил все параметры для «args» для удобства чтения.

Вызов функции:

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

Согласен! Я думаю, не имеет значения, что люди сейчас его заворачивают, так как ответ уже здесь :) –

Смежные вопросы