我有这个调用.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
);
我在msg变量中收到以下值:
""{\"d\":\"{\\\"ComponentId\\\":994,\\\"Latitude\\\":32.219627009236405,\\\"Longitude\\\":-110.96843719482422,\\\"LocationName\\\":\\\"Tucson\\\",\\\"StreetAddress\\\":\\\"7201 E 22nd Street \\\",\\\"City\\\":\\\"Tucson\\\",\\\"State\\\":\\\"AZ\\\",\\\"PostalCode\\\":null}\"}""
我不知道为什么会这样格式化,似乎只在responseText中执行此操作。
有没有人有任何想法?
答案 0 :(得分:2)
正如SLaks所提到的,同步AJAX是一个非常糟糕的想法®。如果您要在地图上循环绘制项目,则无论如何都不想为每个项目调用服务器 - 由于所有项目的累积延迟,您将获得绝对可怕的性能而不仅仅是几个项目往返。
更好的方法是向服务器提交componentId
数组。 服务器然后可以遍历ID数组并返回一个lat / longs数组以及其他任何你在地图上绘制的内容。
$.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
});
您可能还想查看this plugin,这样可以更轻松地从jQuery调用ASMX服务。
答案 1 :(得分:0)
直接回答你的问题 - 你要解析json两次 - 一次是因为你指定了dataType:'json',再次使用$ .toJSON。您可以将数据类型更改为“text”,它将解决您的问题。
但是,正确的答案是使用带回调的异步调用。其他人已经回答了我正在打字的问题,所以请看看他们的答案:)
<强> - 编辑 - 强>
回答你的意见(因为格式化在评论中不起作用)。您不需要对数据进行字符串化 - 您可以将其作为对象发送。在函数之前不需要声明msg变量。 Async是默认设置,因此您可以将其保留。
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数据,我猜你想将它附加到列表中,然后你会调用在地图上重绘位置数据的函数。