如何使用javascript& amp;异步迭代数组承诺

时间:2016-11-03 12:53:30

标签: javascript asynchronous promise

有人可以帮助我使用javascript& amp;异步迭代数组承诺?以下是我想要实现的内容的简化细分 - 我有一系列产品要插入数据库。阵列中的许多产品都是重复的。因此,我的算法是:

  1. 检查产品的产品代码是否已在数据库中
  2. 如果它在数据库中,请查看@下一个产品
  3. 如果它不在数据库中,请插入产品
  4. 我在异步执行此操作时遇到问题。到目前为止,这是我的代码:

    var checkIfProductExists = function(product_code) {
    
            return new Promise(function(resolve, reject) {
    
                db.collection('products').find( {product_code: product_code } ).toArray(function(err, res) {
                    if(err) {
                        console.log('--err checking if product exists');
                        console.log(err);
                    } else {
                        resolve(res)
                    }
                });
    
            }); 
    }
    
    var processRecords = function () {
    
        fetchProducts().then(function(products) { //fetch products to insert
    
            async.each(products, function(product) {
    
                checkIfProductExists(product).then(function(result) {
                    if(result) {
                        //product exists; move onto the next product
                        callback();
                    } else {
                        //product doesn't exist; insert it
                        insertProduct(product);
                        callback();
                    }
                });
    
            }, function(err) {
                if(err) {
                    console.log('--async error--');
                }
            });
        }
    
    }
    
    processRecords();
    

    但是,无论我的checkIfProductExists方法中是否找到匹配项,此逻辑都会导致我的数组中的每个产品都被插入...有人可以帮忙吗?

    提前致谢!

2 个答案:

答案 0 :(得分:0)

如上所述,如果db.find(...).toArray()调用未能找到匹配的条目,它将返回空数组,而不是" false"值。

您应该检查checkIfProductExists结果的长度,或者将该函数解析为布尔值而不是可能为空的数组,即

resolve(res && (res.length > 0));

答案 1 :(得分:-1)

您需要将异步的默认值更改为false。 默认值为true。