Javascript for循环中的if/else语句

Javascript for循环中的if/else语句,javascript,json,parse-platform,Javascript,Json,Parse Platform,我正在将JSON数组中的单个结果写入Parse.com数据库。尝试的过程如下所示: 对于JSON数组中的每个结果项,在类“TestClass”中搜索列“EAN”,查找“JSON结果:EAN”的内容 然后 如果JSON结果:EAN存在:-console.log(“已在DB中”) 否则 将JSON结果:EAN写入Parse DB:EAN&JSON结果:name写入Parse DB:name 我遇到的问题是,如果我说20个结果具有不同的名称和EAN编号-假设数据库中没有任何结果,下面的脚本将20个结果

我正在将JSON数组中的单个结果写入Parse.com数据库。尝试的过程如下所示:

对于JSON数组中的每个结果项,在类“TestClass”中搜索列“EAN”,查找“JSON结果:EAN”的内容

然后

如果JSON结果:EAN存在:-console.log(“已在DB中”)

否则

JSON结果:EAN写入Parse DB:EAN&JSON结果:name写入Parse DB:name

我遇到的问题是,如果我说20个结果具有不同的名称和EAN编号-假设数据库中没有任何结果,下面的脚本将20个结果写入数据库,但每次写入都包含最后一个JSON结果的名称和EAN编号

以下是我的生产代码的简化版本:

$.ajax(settings).done(function(response) {
    var Products = Parse.Object.extend("TestClass");

    for (i in response.Products) {
        var name = response.Products[i].Name;
        var EAN = response.Products[i].EANBarcode;

        var query = new Parse.Query(Products);
        query.equalTo("EAN", EAN);
        query.find({
            success: function(results) {
                if (results.length > 0) {
                    var no = results[0].get("EAN");
                    var title = results[0].get("name");
                    console.log("ALEADY HERE: " + "[" + no + "] " + title);
                } else {
                    console.log('No matching records for' + name);
                    var newProduct = new Products();
                    newProduct.set("name", name);
                    newProduct.set("EAN", EAN);
                    newProduct.save({
                        success: function() {
                            console.log("Saved: " + name);
                        },
                        error: function(error) {
                            console.log("Error: " + error.message);
                        }
                    });
                }
            },
        });
    });
如果我不查询产品并直接将其写入数据库(即:不使用query.find)并按如下方式应用代码,则数据库条目会复制20个不同的结果:

$.ajax(settings).done(function(response) {

    var Products = Parse.Object.extend("TestClass");

    for (i in response.Products) {

        var name = response.Products[i].Name;
        var EAN = response.Products[i].EANBarcode;

        var newProduct = new Products();

        newProduct.set("name", name);
        newProduct.set("EAN", EAN);

        newProduct.save({
            success: function() {
                console.log("Saved: " + name);
            },
            error: function(error) {
                console.log("Error: " + error.message);
            }
        }),
    });
});

我不明白为什么较低的代码可以工作,但当您输入.find命令时,它就不能工作了?

我处理此类问题(循环和条件中的多个异步操作)的方法是分解为更简单的操作,并用承诺连接它们。例如,让我们用一个函数来查找给定“EAN”的产品

这是一个用名称和EAN创建的产品

function productWithEAN(EAN) {
    var Products = Parse.Object.extend("TestClass");
    var query = new Parse.Query(Products);
    query.equalTo("EAN", EAN);
    return query.first();
}
function createProduct(name, EAN) {
    var Products = Parse.Object.extend("TestClass");
    var newProduct = new Products();
    newProduct.set("name", name);
    newProduct.set("EAN", EAN);
    return newProduct.save();
}
现在,让我们循环
response.Products
,在解析中查找匹配的产品,如果找不到匹配的产品,则创建

function findOrCreateProducts(response) {
    var promises = response.Products.map(function(p) {
        var name = p.Name;
        var EAN = p.EANBarcode;
        return productWithEAN(EAN).then(function(product) {
            return (product)? product : createProduct(name, EAN);
        });
    });
    return Parse.Promise.when(promises).then(function() {
        // return a proper array
        return Array.prototype.slice.call(arguments);
    });
}
EDIT稍微澄清一下数据模型,下面假设一个名为UserInventory的类,它至少有两个指针属性:一个指向产品的指针称为“Product”,另一个指向Parse.User的指针称为“User”

叫它

$.ajax(settings).done(function(response) {
    var user = Parse.User.current();
    buildUserInventoryFromRemoteSearch(user, response).then(function(result) {
        // at this point, everything is done
    }, function(error) {
        // something went wrong
    });
});
顺便说一句,在某个时候,需要获取用户的库存

function userInventoryForUser(user) {
    var query = new Parse.Query("UserInventory");
    query.equalTo("user", user);
    query.include("user");
    query.include("product");
    return query.find();
}

希望你能研究一下这一点,掌握方法的诀窍。关键思想:是一个小的、承诺返回的函数,可以执行逻辑块或工作。

我得到了以下控制台消息:uncaughtreferenceerror:u实际上不是定义的,只是使用map,在纯JS中很好。编辑好了,开始工作了!谢谢我不完全明白发生了什么(清晨在我的时区&睡觉时间)。我明天会搞清楚发生了什么事。假设,如果我想在数据库中写入另一个字段(比如price),我会编写
newProduct.set(“price”,price)在createProduct中&
var price=p.price在findOrCreateProducts上?没错。如果还有什么我可以解释的,请随意询问,我会编辑。是的,那一行上的
是一个三元运算符,它计算到
的左侧:
如果问号前的条件为真,则计算到右侧。返回的不是找到的产品,就是创建产品的承诺。
function userInventoryForUser(user) {
    var query = new Parse.Query("UserInventory");
    query.equalTo("user", user);
    query.include("user");
    query.include("product");
    return query.find();
}