forEach()内的回调

时间:2017-01-18 07:06:14

标签: javascript node.js mongodb

上传单个图片时,即uploadResults只有一个对象 - 以下工作正常。

上传多张图片时,它不会。图像对象在数据库中正确创建,但相册对象具有重复图像。例如,如果我上传image1和image2,album.Images应该只是[image1,image2],而是[image1,image2,image2]。我认为问题是foreach内部回调的时间,但不能很好地指出这个问题。

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...
        });
     });
 });

2 个答案:

答案 0 :(得分:1)

为什么要在每次迭代中保存相册?使用Promise(可能需要all的polyfill)。使用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
        });
    });

答案 1 :(得分: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...
            });
        }
     });
 });