2017-01-18 19 views
2

При загрузке одного изображения, то есть uploadResults имеет только один объект - нижеследующие работы отлично.Обратные вызовы внутри forEach()

При загрузке нескольких изображений это не так. Объект изображения создается правильно в db, но объект альбома имеет повторяющиеся изображения. Например, если я загружу image1 и image2, album.Images должен быть просто [image1, image2], но вместо этого он будет [image1, image2, image2]. Я считаю, что вопрос о сроках обратных вызовов внутри Еогеасп, но не совсем точно вопрос ..

uploadResults.forEach(function(uploadedItem) { 
    var image = new Images({ 
     imageUrl: uploadedItem.url, 
    });  
    image.save(function (err, doc) {  
     album.Images.push(doc.id); 
     album.save(function(err, doc) { 
      //err handling... 
     }); 
    }); 
}); 
+0

Ваш код кажется прекрасным. Пожалуйста, напишите больше кода. –

+0

@ Alexandru-IonutMihai Я не хочу добавлять слишком много шума, и я думаю, что я опубликовал все, что имеет значение, но я могу ошибаться. Если пройдет еще какое-то время, и нет никаких ссылок, я отправлю больше кода, спасибо –

+0

определение Images и album.Images? – softwarenewbie7331

ответ

0

Я получил его на работу запуске только album.save() на последней итерации.

uploadResults.forEach(function(uploadedItem, idx, array) { 
    var image = new Images({ 
     imageUrl: uploadedItem.url, 
    });  
    image.save(function (err, doc) {  
     album.Images.push(doc.id); 
     if (idx === array.length - 1) { 
      album.save(function(err, doc) { 
       //err handling... 
      }); 
     } 
    }); 
}); 
1

Почему вы спасая альбом на каждой итерации? Используйте Promise (возможно, нужно заполнить для заполнения all). Используйте es6-promise:

const Promise = require('es6-promise').Promise; 

let promises = []; 
uploadResults.forEach(uploadedItem => { 
    let promise = new Promise((resolve, reject) => { 
     let image = new Images({ 
      imageUrl: uploadedItem.url, 
     }); 
     image.save((err, doc) => { 
      album.Images.push(doc.id); 
      // No saving here 
     }); 
    }); 
    promises.push(promise); 
}); 

Promise 
    .all(promises) 
    .then(() => { 
     album.save((error, doc) => { 
      // rest of code 
     }); 
    });