gpt4 book ai didi

javascript - for 循环中的 if/else 语句

转载 作者:行者123 更新时间:2023-11-29 21:37:10 24 4
gpt4 key购买 nike

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

对于 JSON 数组中的每个结果项 - 在类 "TestClass" 的列 "EAN" 中搜索 "JSON Result:EAN" 的内容>.

然后...

如果存在 JSON 结果:EAN:- console.log("Already In DB");

否则

JSON Result:EAN 写入Parse DB:EAN & JSON Result:nameParse DB:name

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

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

$.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 命令时它却不工作?

最佳答案

我解决此类问题(循环和条件中的多个异步操作)的方法是分解为更简单的操作,并将它们与 promise 联系起来。因此,例如,让我们有一个函数来查找给定“EAN”的产品...

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,在解析中寻找匹配的 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);
});
}

编辑 稍微澄清一下数据模型,下面假设一个名为 UserInventory 的类,它至少有两个指针属性:一个指向名为“product”的产品的指针,一个指向 Parse 的指针。用户称为“用户”。

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

希望你能研究这个以掌握方法的窍门。关键思想:是执行逻辑 block 或工作的小型、返回 promise 的函数。

关于javascript - for 循环中的 if/else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com