#javascript #json #parse-platform
#javascript #json #синтаксический анализ-платформа
Вопрос:
Если бы кто-нибудь мог мне помочь с этим, это спасло бы жизнь!!
(Я использую синтаксический анализ)
По сути, это задание синтаксического анализа пытается выполнить: 1) запрашивает все объекты класса с именем channel 2) перебирает каждый объект в массиве «Результаты», который возвращается из запроса 3) вызывает API Google, который возвращает строку JSON 4) анализирует JSON и сохраняет новые экземплярыобъекта с именем Videos
Проблема в том, что я продолжаю получать ошибки: Сбой с: неперехваченной синтаксической ошибкой: неожиданный токен T в: 1 Сбой с: Неперехваченной синтаксической ошибкой: неожиданный конец ввода в: 0
Parse.Cloud.job("TestFunction", function(request, status) {
var query = new Parse.Query("Channel");
query.find ({
success: function (results) {
var httpRaw;
for (var i = 0; i < results.length; i ) {
var channel_id = results[i].get("channel_id");
Parse.Cloud.httpRequest({
url: 'https://www.googleapis.com/youtube/v3/search?part=snippetamp;channelId=UCKy1dAqELo0zrOtPkf0eTMwamp;maxResults=50amp;order=viewCountamp;type=videoamp;key=AIzaSyCLGCJOPU8VVj7daoh5HwXZASnmGoc4ylo',
success: function (httpResponse) {
httpRaw = httpResponse.text;
},
error: function (httpResponse) {
console.error('Request failed with response code ' httpResponse.status);
}
});
var json = JSON.parse(httpRaw);
for (var z = 0; z < json.items.length ; z ){
var video = new Parse.Object("Video");
video.set("video_id", json.items[z].id.videoId.toString());
video.set("video_title", json.items[z].snippet.title.toString());
video.set("video_description", json.items[z].snippet.description.toString());
video.set("video_thumbnail", json.items[z].snippet.thumbnails.medium.url.toString());
video.set("date_published", json.items[z].snippet.publishedAt.toString());
var relation = video.relation("parent_channel");
relation.add(results[i]);
video.save();
}
}
},
error: function() {
}
});
});
Ответ №1:
Я предполагаю, что причина JSON.parse()
в этом. HTTP-запросы неблокируются в облачном коде (и, как правило, везде в JavaScript), поэтому значение JSON.parse()
is вычисляется до httpRaw
того, как было установлено.
Как минимум, вам нужно переместить вызов parse() и следующий цикл в обработчик успеха вашего HTTP-запроса, чтобы они ждали, пока у вас не будет действительного ответа. Я бы предложил также использовать обещания вместо обратных вызовов успеха / ошибки.
Вот как я бы поступил (предупреждение: следует непроверенный код …)
Parse.Cloud.job("TestFunction", function(request, status) {
var query = new Parse.Query("Channel");
query.find().then(function(results) {
var requests = [];
for (var i = 0; i < results.length; i ) {
var channel_id = results[i].get("channel_id");
requests.push(Parse.Cloud.httpRequest({
url: 'https://www.googleapis.com/youtube/v3/search?part=snippetamp;channelId=UCKy1dAqELo0zrOtPkf0eTMwamp;maxResults=50amp;order=viewCountamp;type=videoamp;key=AIzaSyCLGCJOPU8VVj7daoh5HwXZASnmGoc4ylo'
}));
}
return Parse.Promise.when(requests);
}).then(function(results) {
var videos = [];
for(var i = 0; i < results.length; i ) {
var httpRaw = results[i].text;
var json = JSON.parse(httpRaw);
for (var z = 0; z < json.items.length ; z ){
var video = new Parse.Object("Video");
video.set("video_id", json.items[z].id.videoId.toString());
video.set("video_title", json.items[z].snippet.title.toString());
video.set("video_description", json.items[z].snippet.description.toString());
video.set("video_thumbnail", json.items[z].snippet.thumbnails.medium.url.toString());
video.set("date_published", json.items[z].snippet.publishedAt.toString());
var relation = video.relation("parent_channel");
relation.add(results[i]);
videos.push(video);
}
}
return Parse.Object.saveAll(videos);
});
});