for循环中的if / else语句

时间:2016-01-02 23:39:23

标签: javascript json parse-platform

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

对于JSON数组中的每个结果项 - 在" TestClass" 中搜索列" EAN" 以获取" JSON结果:EAN" 。

则...

如果 JSON结果:EAN 存在: - console.log(&#34;已经在DB&#34;); < / p>

否则

JSON结果:EAN 写入解析数据库:EAN &amp; JSON结果:名称指向 解析数据库:名称

我遇到的问题是如果我说20个不同名字的结果&amp; EAN编号 - 假设数据库中没有任何一个,下面的脚本将20个结果写入数据库,但每个写入包含名称&amp;最后一个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);
                        }
                    });
                }
            },
        });
    });

如果我不查询产品&amp;直接写入数据库(即:不要使用query.find)&amp;按如下方式应用代码,数据库条目会复制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命令时却没有?

1 个答案:

答案 0 :(得分:2)

我解决这些问题(循环和条件中的多个异步操作)的方法是分解为更简单的操作并将它们与promises连接起来。因此,举例来说,让我们有一个函数,找到一个产品给出一个&#34; EAN&#34; ...

function productWithEAN(EAN) {
    var Products = Parse.Object.extend("TestClass");
    var query = new Parse.Query(Products);
    query.equalTo("EAN", EAN);
    return query.first();
}

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

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的指针&#34; product&#34;和一个指向Parse.User的指针叫做&#34; user&#34;。

// return a promise to create user inventory for a user and product
function createUserInventory(user, product) {
    var UserInventory = Parse.Object.extend("UserInventory");
    var newUI = new UserInventory();
    newUI.set("user", user);
    newUI.set("product", product);
    return newUI.save();
}

// return a promise to create user inventory for a user and product, only if one doesn't exist
function findOrCreateUserInventory(user, product) {
    var query = new Parse.Query("UserInventory");
    query.equalTo("user", user);
    query.equalTo("product", product);
    return query.first().then(function(userInventory) {
        return (userInventory)? userInventory : createUserInventory(user, product);
    });
}

// return a promise to create a user's inventory from a remote api response
function buildUserInventoryFromRemoteSearch(user, response) {
    return findOrCreateProducts(response).then(function(products) {
        var promises = products.map(function(product) {
            return findOrCreateUserInventory(user, product);
        });
        return Parse.Promise.when(promises).then(function() {
            // return a proper array
            return Array.prototype.slice.call(arguments);
        });
    });
}

称之为......

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

希望您可以研究这个以获得方法的悬念。关键思想:是小型的,承诺返回的功能,可以执行逻辑块或工作。