使用Ajax+跨域jsonp从服务器成功拿到数据,但是想把拿到的数据传给全局变量,可是始终不成功,希望哪位大神看看我的代码!下面是我的html、servlet代

L___C 2015-10-07 06:39:09
        var public_obj; //全局变量
//Ajax从服务器拿数据
function getJsonObj(url_servlet){
var urlStr = "http://192.168.1.109:8080/test8/servlet/" + url_servlet + "?callback=?";
// 调用jQuery提供的Ajax方法
$.ajax({
type : "POST",
async : false, //(默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
url : urlStr,
data : "{}",
dataType : "jsonp",
success : function(msg) {
public_obj = eval(msg); //调用Json2.js中提供的JSON解析器来解析成JSONObject
console.log("1" + public_obj); //这里可以查到public_obj的值
},
error : function(XMLHttpRequest,textStatus,errorThrown){
alert(errorThrown);
alert(XMLHttpRequest.status);//200
alert(XMLHttpRequest.readyState);//4
alert(textStatus);//pasererror
}
});
//while (!public_obj){};
console.log("2" + public_obj); //但是这里public_obj的值就是undefined了
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("application/x-json");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String userjsonString;
PrintWriter out = response.getWriter();

userjsonString = JsonTools.createJsonString("publicinfo",
JsonService.getPublicInfo(TPublicinfoAction.getPublicinfo()));

String callback = request.getParameter("callback");
out.println(callback + "(" + userjsonString + ")");
//System.out.println("JSON:" + userjsonString);
System.out.println(callback);
out.flush();
out.close();
}
...全文
177 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hch126163 2015-10-10
  • 打赏
  • 举报
回复
执行 console.log("2" + public_obj); 时,服务器还没有响应回浏览器 回调里面使用 服务器响应回来的值
wangji8171 2015-10-10
  • 打赏
  • 举报
回复
你ajax响应服务器,数据都没有返回来console.log()就已经执行了,当然是undefined
Go 旅城通票 2015-10-08
  • 打赏
  • 举报
回复
jsonp是异步的,没有返回执行赋值都执行console.log了,当然是undefined。。设置async:false没用

你要注意全局变量的使用位置,只能放到jsonp成功的回调里面使用
街头小贩 2015-10-08
  • 打赏
  • 举报
回复
引用 5 楼 Raffin 的回复:
[quote=引用 4 楼 xiaofanku 的回复:] 如果你的callback的值(FunctionA),在当前页面可以找到它(FunctionA)的定义.servlet的content-type可以设成text/javascript 因为ajax默认是异步的,不要把它的返回值放到某个变量中。因为js是同步顺序执行的。有很大的机率是执行流执行时,ajax 还没有返回可用的结果
他已经设置是同步调用了。[/quote] ajax中的同步是指网络请求/响应,这不能让js执行流停下来
鸣鸣Amadues 2015-10-08
  • 打赏
  • 举报
回复
dataType是json的话,返回的msg是一个json对象,然后可以变量=msg.xxx,可以拿到值。
鸣鸣Amadues 2015-10-08
  • 打赏
  • 举报
回复
引用 4 楼 xiaofanku 的回复:
如果你的callback的值(FunctionA),在当前页面可以找到它(FunctionA)的定义.servlet的content-type可以设成text/javascript 因为ajax默认是异步的,不要把它的返回值放到某个变量中。因为js是同步顺序执行的。有很大的机率是执行流执行时,ajax 还没有返回可用的结果
他已经设置是同步调用了。
街头小贩 2015-10-07
  • 打赏
  • 举报
回复
如果你的callback的值(FunctionA),在当前页面可以找到它(FunctionA)的定义.servlet的content-type可以设成text/javascript 因为ajax默认是异步的,不要把它的返回值放到某个变量中。因为js是同步顺序执行的。有很大的机率是执行流执行时,ajax 还没有返回可用的结果
街头小贩 2015-10-07
  • 打赏
  • 举报
回复
给你个示例: servlet:

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("application/javascript");
		response.setCharacterEncoding("utf-8");
		/**
		 * 1.没有v,忽略版本控制机制
		 * 2.    有v:比较cookie中的dcmv,一致忽略,不一样重新缓存
		 */
		long d=System.currentTimeMillis();
		response.setDateHeader("Last-Modified",d);
		response.setDateHeader("Expires", d + 24*60*60*1000);  
		response.setHeader("Cache-Control", "public");  
		response.setHeader("Pragma", "Pragma");

		int uid=0;
		try{
			uid=Integer.parseInt(request.getParameter("uid"));
		}catch(NullPointerException | NumberFormatException e){
			response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);//304
			return;
		}
		ChannelService cs=new ChannelServiceImple();
		List<ChannelBean> channels=cs.asynLoadSubscribeChannel(uid);
		if(channels.size()==0){
			channels.add(new ChannelBean("历史上今天",0));
		}
		Gson gson=new Gson();		
		//回调函数
		String callbackFuntion=request.getParameter("callback");
		PrintWriter pw=response.getWriter();
		pw.print(callbackFuntion+"("+gson.toJson(channels)+");");
		pw.flush();
		pw.close();
	}
我希望服务器返回一个可以缓存的结果集 版本一,无法缓存

                        $.getJSON("/channel/loading?uid="+uid+"&v="+v+"&callback=?", function(data){
                                _loadSubscribeChannel(data);
                        });
版本二,可以缓存

                        $.ajax({type:'GET',
                        				url:'/channel/loading?uid='+uid+'&v='+v,
                        				jsonpCallback:'jsonCallback',
                        				contentType:'application/json',
                        				cache:'true',
                        				dataType:'jsonp',
                        				success:function(data){
                        					 _loadSubscribeChannel(data);
                        				}
                        });
我所说的缓存的是指浏览器缓存.避免每次都去服务器get,缓存成功后,再次get时会返回304
街头小贩 2015-10-07
  • 打赏
  • 举报
回复
是不明白json-p么? 1.是用一个你事先定义的函数来处理返回的数据。 GET:http://xxx.com/?callback=你定义的函数 服务器返回后:大概的样式为: 你的定义的函数(json数据); 你把这(”你的定义的函数(json数据)“)给全局变量干么 2.服务器的content-type你写的不对
response.setContentType("application/javascript");
3.都没有数据到服务器你干么用POST
slwsss 2015-10-07
  • 打赏
  • 举报
回复
type : "get", dataType : "jsonp", public_obj = msg;

87,937

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧