【发布时间】:2018-04-14 01:16:03
【问题描述】:
正如标题所述,我在 Parse 中遇到了 Promise 问题。
我正在努力首先了解 Promises 本身是如何工作的,尤其是在 Parse 中。
我已经坚持了大约三周,我最接近解决方案的是返回一个空数组。
我正在尝试做的是抓取一个站点,然后从表中创建对象(这是有效的)
问题出在哪里,是我在结果上运行一个 for 循环并查询每个 Dam 名称以从数据库中获取结果 objectid。
这是我的代码:
var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function(err, res, done) {
if (err) {
console.log(err);
} else {
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
console.log($("title").text());
}
done();
}
});
从 Dom 创建对象并将它们添加到数组中的函数:
function getDamObjects(Dom) {
var dom = Dom;
var LevelObjects = [];
for (i = 1; i < dom.length - 1; i++) {
var TableRow = dom.eq(i);
var NameString = TableRow.children().eq(0).text();
var RiverString = TableRow.children().eq(1).text();
var FSCString = TableRow.children().eq(4).text();
var ThisWeekString = TableRow.children().eq(5).text();
var LastWeekString = TableRow.children().eq(6).text();
var LastYearString = TableRow.children().eq(7).text();
NameString = NameString.replace('#', '');
NameString = NameString.replace('$', '');
NameString = NameString.replace('&', '');
NameString = NameString.replace('@', '');
ThisWeekString = ThisWeekString.replace('#', '');
ThisWeekString = ThisWeekString.replace('$', '');
ThisWeekString = ThisWeekString.replace('&', '');
ThisWeekString = ThisWeekString.replace('@', '');
LastWeekString = LastWeekString.replace('#', '');
LastWeekString = LastWeekString.replace('$', '');
LastWeekString = LastWeekString.replace('&', '');
LastWeekString = LastWeekString.replace('@', '');
LastYearString = LastYearString.replace('#', '');
LastYearString = LastYearString.replace('$', '');
LastYearString = LastYearString.replace('&', '');
LastYearString = LastYearString.replace('@', '');
var level = {};
/*
getDamObject(NameString).then(function(DamObject){
let DamID = DamObject.id;
*/
level['Dam'] = NameString; //DamID;
level['ThisWeek'] = ThisWeekString;
level['LastWeek'] = LastWeekString;
level['LastYear'] = LastYearString;
LevelObjects.push(level);
};
return LevelObjects;
};
获取大坝对象代码:
function getDamObject(Dam) {
var promise = new Parse.Promise();
var query = new Parse.Query("DayZeroDams");
query.equalTo("Name", Dam);
query.first().then(function(DamObject) {
promise.resolve(DamObject);
}, function(error) {
promise.reject(error);
});
return promise;
}
调用的云代码:
Parse.Cloud.define('jsdom', function(request, response) {
c.queue([{
uri: 'xxxxxx',
// The global callback won't be called
callback: function(err, res, done) {
if (err) {
response.error(err);
} else {
var $ = res.$;
var ResultsArray = [];
var dom = res.$('#mainContent_tw').children('tr');
return Parse.Promise.as().then(function() {
var promise = Parse.Promise.as();
var LevelObjects = getDamObjects(dom);
_.each(LevelObjects, function(DamLevel) {
promise = promise.then(function() {
var Name = DamLevel["Dam"];
var query = new Parse.Query("DayZeroDams");
query.equalTo("Name", Name);
return query.first().then(function(result) {
let damID = result.id;
ResultsArray.push(damID);
return Parse.Promise.as();
}, function(error) {
response.error(error);
});
});
});
return promise;
}).then(function() {
response.success(ResultsArray);
}, function(error) {
response.error(error);
});
//response.success(LevelObjects);
}
done();
}
}]);
});
请注意,我在 Javascript 方面相当新手,我最近才开始学习它,以便使用我的服务器代码。
【问题讨论】:
-
在输入代码时考虑使用缩进,它会让你和其他需要阅读它的人更轻松。
-
@CertainPerformance 对此感到抱歉 ^^ 我是新来的,我不确定如何正确格式化我的代码,因为当我将其粘贴到此处时所有缩进都发生了变化,所以我只是遵循四个空格规则.
-
简而言之,将
getDamObjects设为async函数,将每个异步调用变成一个promise,并将它们中的每一个都设为await。或者,如果您不希望串行等待,请改用await Promise.all。 -
@CertainPerformance 我希望它是连续的(我想我至少会这样做)。您能否发布一个解决方案或至少一个可以为我指明正确方向的示例:)
-
@CertainPerformance PS你有什么理由注释掉云代码功能吗?如果写得不好,对不起
标签: javascript parse-platform promise parse-server parse-cloud-code