【发布时间】:2014-09-13 21:23:50
【问题描述】:
我有一个解析云代码函数,在这个函数中,我对一些项目进行查询,然后使用 for 循环保存其中一些项目。但是 for 循环继续,并没有正确保存之前的一些项目。
这是一个通用版本的代码:
Parse.Cloud.define("saveCurrentDayItems", function(request, response) {
var xmlReader = require('cloud/xmlreader.js');
var MenuURL = Parse.Object.extend("MenuURL");
var queryMenuURL = new Parse.Query(MenuURL);
queryMenuURL.find().then(function(resultsMenuURL) {
//********************************************************************************************************
//I want the save to happen before it goes thought this for loop for the second time, and so on
for (var i = 0; i < resultsMenuURL.length; i++) {
var location = resultsMenuURL[i].get("Location");
Parse.Cloud.httpRequest({
url: url,
success: function(httpResponse) {
var xmlData = httpResponse.text;
xmlReader.read(xmlData, function (err, res){
if(err) return console.log(err);
for (var i3 = 0; i3 < res.menu.day.at(dayNumber).meal.count(); i3++) {
var meal = res.menu.day.at(dayNumber).meal.at(i3).attributes().name;
testItem.set("meal", meal);
testItem.set("location", location);
testItem.save().then(function(testItem) {
});
}
}
});
},
error: function(httpResponse) {
console.error('Request failed with response code ' + httpResponse.status);
}
});
}
});
});
我查看了解析文档,但我无法理解它们,我无法理解的承诺部分。
非常感谢您提前提供的帮助
编辑 2
当我有这样的代码时,我收到错误 TypeError: Cannot call method 'reduce' of undefined
Parse.Cloud.define("saveCurrentDayItems23", function(request, response) {
var xmlReader = require('cloud/xmlreader.js');
//First worker function, promisify xmlReader.read();
function readResponse_async(xlmString) {
var promise = new Parse.Promise();
xmlReader.read(xlmString, function (err, res) {
if(err) {
promise.reject(err);
} else {
promise.resolve(res);
results = res;
}
});
return promise;
}
//Second worker function, perform a series of saves
function saveMeals_async(meals, location, testItem) {
return meals.reduce(function(promise, meal) {
return promise.then(function() {
testItem.set("meal", meal.attributes().name);
//the line above does not work it cannot get meal, it is undefined
testItem.set("location", location);
return testItem.save();
});
}, Parse.Promise.as());
}
var MenuURL = Parse.Object.extend("MenuURL");
var queryMenuURL = new Parse.Query(MenuURL);
//Master routine
queryMenuURL.find().then(function(resultsMenuURL) {
for (var i = 0; i < resultsMenuURL.length; i++) {
var url = resultsMenuURL[i].get('URL');
return resultsMenuURL.reduce(function(promise, item) {
return promise.then(function() {
return Parse.Cloud.httpRequest({
url: url,
//data: ... //some properties of item?
}).then(function(httpResponse) {
return readResponse_async(httpResponse.text).then(function() {
var TestItem = Parse.Object.extend("TestItem");
var testItem = new TestItem();
return saveMeals_async(result.menu.day.meal.counter.dish.name.text(),item.get("Location"),
testItem);
//this line above does not work, it sends only one string, not an array, so reduce cannot be called
});
});
});
}, Parse.Promise.as());
}
}).fail(function(err) {
console.error(err);
});
});
【问题讨论】:
-
如果您需要帮助,您需要更具体地了解问题到底是什么以及您需要帮助的具体内容。请参考您的代码的特定部分,描述您希望它做什么,并解释当前发生的与此不同的事情。例如,您说您希望在第一个
for循环之前进行保存,但似乎与保存有关的唯一代码不仅深埋在for循环中,而且还嵌入了另一个在里面。不清楚你想做什么。 -
@jfriend00 好的,尽量做到具体。我有这个返回几个 URL 的查询,然后从这些 url 中获取一个 http 请求,以便我可以解析一些数据。一旦我解析了其中的一些数据,我想保存一些原始数据和一些解析后的数据。我的目标是在 for 循环再次运行之前保存数据?这有意义吗?
标签: javascript xml-parsing parse-platform cloud promise