2016-11-13 2 views
1
entry.find(function(err,user){ 
    for(var i=0;i<user.length;i++){ 
    if(user[i].tablenumber==-1){ 

     assigntable(user[i]); 
    } 
    } 

}); 

так что я пытаюсь сделать здесь, чтобы дождаться завершения каждого цикла цикла до вызова асинхронной функции присваивания. Assigntable - это обратный вызов для внесения изменений в базу данных. Проблема, с которой я столкнулся сейчас, - это то, что вызов calltable вызывается после завершения цикла for, все пользователи будут назначены таблице 1. Но я хочу: назначить первый для таблицы 1 -> назначить таблицу в следующем цикле определяет таблицу 1 назначается -> пользователь 2, назначенный таблице 2 и т. д. Как это сделать?Как заставить цикл for ждать завершения обратного вызова в nodejs?

Редактировать: Assgintable - это рекурсивный вызов, который редактирует базу данных в обратном вызове. обновление будет основано на результатах полученной базы данных из предыдущего цикла, но я не имею в виду здесь.

function assigntable(user,tableindex){ 
    console.log("in recursion with tableindex"+tableindex); 
    if(tableindex==3) 
    return; 
    console.log(user.date+user.time+tableindex); 
    entry.find({ 
     $and: [ 
      { "tablenumber": tableindex}, 
      { "date": user.date }, 
      {"time":user.time} 
      ] 
    },function(err, result) { 
     if(result.length==0){ 
     console.log(result+"result is "); 
     entry.update({"_id":user._id},{"tablenumber":tableindex},function(err, numberAffected) { 
      if(!numberAffected){ 

      } 
      else 
      { 
      console.log("entryupdated with "+tableindex) 
      } 
     }); 
     return; 
    } 
    else{ 
    console.log(tableindex); 
    assigntabe(user,tableindex+1); 
    } 
}) 

}

+0

ли 'assigntable()' 'возвращать Promise'? – CodingWithSpike

+0

просто для уточнения - вы хотите назначить для пользователя [0] до завершения назначения для пользователя [1]? комментарий о рекурсии также немного запутан, вы можете включить больше кода для уточнения? – skav

+0

@skav yes Я хочу назначить для пользователя [0], чтобы закончить до назначения для пользователя [1], называется –

ответ

1

вы можете использовать async.foreach для того, чтобы итерацию синхронно:

entry.find(function(err,user){ 
    async.forEach(user, function (item, callback){ 
    if(item.tablenumber==-1){ 
     console.log(item); 
     assigntable(item,1); 
    }  
    callback(); 
    }, function(err) { 
    console.log('iterating done'); 
    })}).sort({datesubmitted:1}); 
+0

Я пробовал, но не работал. функция обратного вызова в назначаемой функции запускается только после завершения цикла for. –

+0

связаны для большего контекста: http://stackoverflow.com/questions/21184340/async-for-loop-in-node-js –

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