У меня есть этот сценарий, который называет .net WebService
msg = $.toJSON(
$.ajax({
type: "POST",
url: "http://[url]/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails",
contentType: "application/json; charset=utf-8",
data: $.toJSON({'componentId':994}),
dataType: "json",
async: false
}).responseText
);
И я получаю следующее значение в переменной сообщения:
""{\"d\":\"{\\\"ComponentId\\\":994,\\\"Latitude\\\":32.219627009236405,\\\"Longitude\\\":-110.96843719482422,\\\"LocationName\\\":\\\"Tucson\\\",\\\"StreetAddress\\\":\\\"7201 E 22nd Street \\\",\\\"City\\\":\\\"Tucson\\\",\\\"State\\\":\\\"AZ\\\",\\\"PostalCode\\\":null}\"}""
Я понятия не имею, почему это отформатировало бы этот путь, кажется, только делает это в responseText.
У кого-либо есть какие-либо идеи?
Как упоминал SLaks, синхронный AJAX - очень плохая идея ® . Если вы зацикливаете элементы для нанесения на карту, вы в любом случае не хотите вызывать сервер для каждого элемента - вы получите абсолютно ужасную производительность с более чем парой элементов из-за совокупной задержки всех круглые поездки.
Гораздо лучшим методом было бы отправить массив из componentId
на ваш сервер. Затем сервер может перебирать массив идентификаторов и возвращать массив широты / долготы и все остальное, что вы можете нанести на карту.
$.ajax({
type: "POST",
url: "http://[url]/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails",
contentType: "application/json; charset=utf-8",
data: $.toJSON([{'componentId':994},{'componentId':995}, ... ]),
dataType: "json",
async: true,
success: callbackFunctionThatPlotsReturnedPoints
});
Вы также можете попробовать этот плагин , который упрощает вызов служб ASMX из jQuery.
Чтобы ответить на ваш вопрос напрямую - вы дважды анализируете json - один раз, потому что вы указываете dataType: 'json', и снова с помощью $ .toJSON. Вероятно, вы можете изменить тип данных на «текст», и это решит вашу проблему.
Правильный ответ - использовать асинхронный вызов с обратным вызовом. Кто-то еще ответил на вопрос, когда я набирал текст, поэтому посмотрите на его ответ:)
- edit -
Чтобы ответить на ваши комментарии (потому что форматирование в комментариях не работает). Строковые данные не требуются - их можно отправить как объект. Нет необходимости объявлять переменную msg перед функцией. По умолчанию используется асинхронный режим, поэтому вы можете просто не использовать его.
var list = [994, 994, 994, 994];
$.ajax({
type: "POST",
url: "http://www.eaglerider.com/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails",
contentType: "application/json; charset=utf-8",
data: { componentIdCollection: list },
dataType: "json",
sucess: function(msg){
// msg holds your JSON data
console.log(msg);
}
});
Как только у вас есть эти данные msg, я предполагаю, что вы хотите добавить их в список, тогда вы должны вызвать функцию, которая перерисовывает данные местоположения на карте.