for循环中的if/else语句
if/else statement in a for loop
我正在将JSON数组中的单个结果写入Parse.com数据库。尝试的过程如下:
对于JSON数组中的每个结果项,在类"TestClass"中的列"EAN"中搜索的"JSON result:EAN"内容。
然后。。。
如果存在JSON结果:EAN:-console.log("Already In DB")
其他
将JSON结果:EAN写入分析DB:EAN&JSON结果:name到分析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命令时,它就不起作用了?
解决此类问题(循环和条件中的多个异步操作)的方法是分解为更简单的操作,并用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);
});
}
EDIT稍微澄清一下数据模型,下面假设一个名为UserInventory的类,该类至少有两个指针属性:一个指针指向Product,称为"Product",另一个指针指针指向Parse。User,名为"User"。
// 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();
}
希望你能研究一下,掌握这个方法的窍门。关键思想:是小的,承诺返回函数,做逻辑块或工作。
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 如何检查if/else语句中的随机条件
- 在Javascript中为if/else语句添加OR
- geoTest函数-创建if/else语句
- Jquery/Javascript使用IF/ELSE语句更改img SRC
- 编写if-else语句的更好方法
- Javascript if和else语句不起作用
- 为什么它立即跳到我的else语句
- 空变量的 else 语句
- 在if/else语句中显示DIV
- 由 if / else 语句中的无效语法导致的语法错误
- jQuery 验证正在复制 else 语句 |验证完成后,不会打印值
- JavaScript if else 语句来显示 html 标签
- 如何做if/else语句并使用控制台.log打印出来
- 此 JavaScript 代码无法正常工作(if-else 语句)
- 不带花括号的If/else语句javascript
- 如何缩短if-else语句
- 用于筛选数据的函数--if.else语句
- 赢得't输入javascript if/else语句
- 打印出带有参数的if-else语句