Я пытаюсь написать функцию Code Cloud Cloud, где параметр представляет собой список объектов, каждый из которых содержит член geoPoint. Для каждого элемента в списке я буду искать хранилище данных анализа для существующего элемента в радиусе 1 миля с тем же именем. Если элемент не существует, создайте элемент и сохраните его в хранилище данных.Parse Cloud Code geoPoint Query Javascript Синтаксис
Моя функция
/**
* Take a list of Place and check for existence in Parse.
* If it doesn't already exist, add it.
* @see https://www.parse.com/questions/access-distance-on-a-geoquery
* @param {JSON Place.PlaceSearch}
* @return none
*/
function addConvertedApiResult(placeData) {
for (var i = 0; i < placeData.length; i++) {
// look near loc for existing name
var loc = new Parse.GeoPoint(placeData[i].lat, placeData[i].lon)
var query = new Parse.Query("Place");
query.withinMiles("location", loc, 1);
query.equalTo("name", placeData[i].name);
console.log("placeData[i].name:"+placeData[i].name);
query.find({
success: function(results) {
// results contains a list of places that are within 1 mile
// and have the same name
console.log("results.length = "+results.length);
if(results.length < 1) {
// add the place
var Place = Parse.Object.extend("Place");
var place = new Place();
place.set("en", placeData[i].name);
place.set("location", loc);
place.set("moreInfo", placeData[i].moreInfo);
place.save();
}
},
error: function(error) {
// There was an error.
console.log("error = "+error.message);
}
});
console.log("leaving addConvertedApiResult");
}
}
Мой запрос к функции Cloud, которая вызывает addConvertedApiResult
(Должен бежать '"' из окна командной строки)
curl -X POST
-H "X-Parse-Application-Id: <key>"
-H "X-Parse-REST-API-Key: <key>" -H "Content-Type: application/json"
-d "{\"name\":\"Storm+Mountain\",\"lat\":44.0760,\"lon\":-103.2280,\"limit\":5,\"radius\":25}" https://api.parse.com/1/functions/getPlace
{"result":[{"lat":43.95483,"lon":-103.36869,"moreInfo":"<apiUrl>/item.php?c=1\u0026i=3439","name":"Storm Mountain"}]}
Результирующий Parse Info Log
I2015-03-03T05:56:26.905Z] v99: Ran cloud function getPlace with:
Input: {"lat":44.0760,"limit":5,"lon":-103.2280,"name":"Storm+Mountain","radius":25}
Result: [{"name":"Storm Mountain","lat":43.95483,"lon":-103.36869,"moreInfo":"<moreInfoUrl>"}]
I2015-03-03T05:56:27.434Z] placeData[i].name:Storm Mountain
I2015-03-03T05:56:27.435Z] leaving addConvertedApiResult
В хранилище данных должно быть указано 4 существующих точки, но ни одно из них не имеет одно и то же имя. Функция, похоже, не выполняет метод query.find. Я не вижу сообщения журнала из успеха: или ошибки: функции. Если я правильно понимаю, эти функции должны позволять мне выполнять код по результатам запроса.
Как я могу подтвердить, что результаты запроса отсутствуют, если console.log не работает?
Я был вверх и вниз по сети, пытаясь использовать различные варианты этого синтаксиса. Правильно ли мой синтаксис?
Спасибо.
Update
Я работаю над этой проблемой снова и был взволнован, чтобы узнать о Promises. К сожалению, моя ситуация не изменилась. Теперь я вызываю эти функции из функции addConvertedApiResult. Я тестировал/отлаживал их с помощью драйвера, написанного в локальном файле javascript, с помощью инструментов Chrome Developer, все работает красиво. Но, когда я развертываю этот код в Parse Cloud Code, выполнение, похоже, исчезает в эфире после того, как я вызываю .find().
Я понимаю, что выполнение кода является асинхронным по CC, но у меня создается впечатление, что использование функции .then() должно преодолеть это ограничение.
Я надеюсь, что кто-то может объяснить мне, что мне не хватает.
Спасибо.
/**
* Take a Place and check for existence in Parse.
* If it doesn't already exist, add it.
* @see https://www.parse.com/questions/access-distance-on-a-geoquery
* @see https://parse.com/docs/js_guide#promises-chaining
* @param {JSON Place.PlaceSearch}
* @return none
*/
function addNewPlace(place) {
// look near loc for already existing place with same name
var loc = new Parse.GeoPoint(place.lat, place.lon)
var query = new Parse.Query('Place');
query.withinMiles('location', loc, 1);
query.equalTo('en', place.name);
query.find().then(function(results) {
if(results.length < 1) {
console.log(place.name+" does not exist")
var Place = Parse.Object.extend("Place");
var newPlace = new Place();
var loc = new Parse.GeoPoint(place.lat, place.lon)
newPlace.set('en', place.name);
newPlace.set('location', loc);
newPlace.set('moreinfo', place.moreinfo);
return newPlace.save();
}
});
}
/**
* Take a list of Place and check for existence in Parse.
* If it doesn't already exist, add it.
* @see https://www.parse.com/questions/access-distance-on-a-geoquery
* @see https://parse.com/docs/js_guide#promises-chaining
* @param {JSON Place.PlaceSearch}
* @return none
*/
function addConvertedApiResult(placeData) {
var _ = require('underscore');
console.log("placeData.legth:"+placeData.length);
_.each(placeData, function(place) {
addNewPlace(place);
});
}
Попробуйте использовать отладчик (Ctrl + Shift + J в Chrome -> вкладка «Источник»). Просто разместите точку останова в строке 'query.find' и обновите страницу (или нажмите кнопку, я не знаю, когда на самом деле должен быть запущен ваш код). –
Благодарим вас за комментарий. Этот код работает в Parse Service не в моем браузере, но вы поднимаете хороший момент. Возможно, мне следовало спросить: «Как мне отладить javascript, который будет развернут в Parse Cloud Code?». – Chad
Представленные выше фрагменты кода являются синтаксически правильными. Моя проблема, однако, заключалась в том, что мне потребовалось некоторое время, чтобы заставить мою голову обернуться вокруг концепции программирования последовательных асинхронных вызовов Parse и других API-интерфейсов от CloudCode. В конечном счете, я смог выполнить то, что хотел, использовать одну единственную функцию с строкой обещаний, используя следующий шаблон. – Chad