2015-03-25 3 views
0

У меня есть этот цикл:метеор, как управлять обновлениями асинхронное в цикле

properties.forEach(function(property) { 
    console.log("property: " + property); 
    var upsertValues = {}; 
    upsertValues["ID"] = property.ID; 
    Properties.upsert(upsertValues, 
     {$set: property}, 
     function(err, nbr) { 
      if(err) 
       console.log(err); 
      else 
       console.log("upsert successful" + nbr); 
     }); 
    }); 
    setTimeout(function() { 
     Fiber(function() { 
      Meteor.call("removeOldProperties", modification_date); 
     }).run(); 
    }, 30000) 
}) 

В основном, это обновляет скамейка документов и в конце концов, он удаляет все сразу, которые не были обновлены.

Мне пришлось использовать TimeOut, потому что без этого я удаляю документы перед их обновлением, так как все операторы Meteor.upsert являются асинхронными.

Есть ли лучший способ сделать это (без использования этого таймаута)?

Спасибо,

ответ

1

Пара мыслей:

  • upserts быстро, нет необходимости обратного вызова
  • Fiber не для сервера
  • Я не понимаю, как ваш upsertValues был действительным запрос. Это относится к документу _id? Если это так, соглашение должно продолжать использовать имя _id, если нет, я бы использовал более описательное имя. Был ли этот код функционирующим?

Что остается:

var upsertsCompleted = 0; 
properties.forEach(function(property) { 
    Meteor.call("upsertProperties", property, function() { 
    if (++upsertsCompleted === properties.length) { 
    Meteor.call("removeOldProperties", modification_date); 
    } 
} 

Meteor.methods({ 
    upsertProperties: function (property) { 
    return Properties.upsert(property.ID, {$set: property}); 
    } 
}); 
+0

Спасибо. это действительно относится к id. Я не использовал символ подчеркивания, потому что я разбираю документы через rest api, и я вставляю их «как есть» в свой db. Но я должен был ... – ndemoreau

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