У меня есть функция, которую я хочу решить только после завершения foreach .. im using q и mongoose, на что ссылаются капитализированные вещи, и в основном я хочу создать набор элементов, затем запустите функцию после завершения foreach.Возвращение q разрешено, когда все операции завершены
function createItems() {
var deferred = Q.defer();
var itemsArray = [{ 'name' : 'spade' }, { 'name' : 'bucket' } , { 'name' : 'sand'}];
itemsArray.forEach(function(itemObj) {
var item = new Item(itemObj); // forces it to use a schema (dont worry)
Item.findOneAndUpdate({
url: item.short_name
}, item, {
upsert: true
}, function(err) {
if (!err) {
console.log(item.name + ' created.');
deferred.resolve();
} else {
deferred.reject(new Error(err));
}
});
});
return deferred.promise;
}
createItems()
.then(function() {
console.log('All items done.');
});
Так что я бы ожидал увидеть на консоли что-то вроде;
созданный объект spade bucket item созданный sand item created Все готово.
Предполагая, что 'Item.findOneAndUpdate' - это асинхронная функция, которую вы фактически вызываете' Q.all' с пустым массивом. функция 'findOneAndUpdate' сама должна быть завернута в/вернуть объект обещания, который вы нажимаете на массив, а затем имеет значение для возврата' Q.all' –
D'oh! Вы, конечно, правы. Я отредактирую. > _ < –
EDIT: и сделано. 'findOneAndUpdate' возвращает запрос Mongoose, который может быть' exec() ''d, чтобы вернуть обещание. –