2017-02-03 4 views
0

Я делаю приложение для лагерей, где пользователь может прийти и создать свой опыт кемпинга и комментарии по нему. Сначала я пытаюсь удалить, если там какие-то лагеря в mongodb, после этого сделать 3 файла фиктивных лагерей, а затем связать с ними комментарии. но, кажется, всегда все 3 лагеря создают первое, а затем комментарии из-за того, что комментарии не могут быть связаны с ними.Node.js/Express - код внутри обратного вызова работает после завершения первой функции

Campground.remove({}, function (err) { 
    if (err) { 
     console.log('some error in campground'); 
    } 
    campdata.forEach(function (seed) { 
     Campground.create(seed, function (err, createdData) { 
      if (err) { 
       console.log('camps not created'); 
      } else { 
       // create comments 
       Comment.create({ 
        description: 'this is the best place but wish if there is internet', 
        author: 'satty' 
       }, function (err, commentdata) { 
        if (err) { 
         console.log(err); 
        } else { 
         createdData.comments.push(commentdata); 
         createdData.save(); 
         console.log(commentdata); 
        } 
       }); 
       console.log(createdData); 
      } //else completed 
     }); // campground create completed 
    }); // for each 
    console.log('removed campgrounds'); 
}); // campground remove 

ответ

0

Помните, что узел является асинхронным. forEach работает синхронно, но функции внутри являются асинхронными - это значит, что они все еще выполняют после цикл forEach завершен. Это проблема для вас, потому что итератор на forEach уже достиг последнего элемента в массиве задолго до того, как выполняется асинхронная функция добавления комментариев.

Одним из способов решения этой проблемы является использование async:

(Убрано лишнее код для краткости)

let async = require('async') 

Campground.remove({}, function(err) { 
    async.each(campdata, function(seed, callback) { 
     Campground.create(seed, function(err, createdData) { 
      let comment = { 
       description: 'this is the best place but wish if there is internet', 
       author: 'satty' 
      } 
      Comment.create(comment, function(err, commentdata) { 
       createdData.comments.push(commentdata) 
       createdData.save() 
       callback(err) 
      }) 
     }) 
    }, function(err) { 
     // all done! 
    }) 
}) 

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

  • Нет связанных вопросов^_^