windows8项目中涉及到下载数据和上传数据。针对小的数据使用的是winjs.xhr(),而针对大的文件,不方便使用post方式直接上传的文件都使用backgroundtransfer进行传输。因为windows8 app虽然后台运行程序也是一个类似ie的进程,但是app和网页在开发中还是有一些不同,所以以下有两点总结。
1.默认ajax请求,相同的url会缓存。
wwahost.exe也会像ie一样,对相同的url返回的数据进行缓存。一般app都会进行crud操作,所以当我们进行操作完之后,我们必须更新数据。但是在一开始我更新了数据,但是界面始终不更新。
var rand = math.random(); //为了演示,这里直接用了一个随机数,实际开发中最好以当前时间为种子的随机数,防止缓存 winjs.xhr({ url: "http://localhost:50623/default.aspx?t="+rand }) .done(function complete(result) { //do something. }, function error(result) { console.log(result.responsetext); });
这样我们每次请求
default.aspx返回的数据应该是最新的。asp.net推出web
api之后,后台最好不要写.aspx页面或者hanler,最好都使用web api,这样传统的web应用,然后mobile
app和windows8 app都可以调用相同的数据服务接口。相对而已比后台使用wcf还是要方便一些。
2.ajax的异步。在windows8 app开发中,这一点开发人员始终要牢记,否则代码出了问题,我们根本无法定位到代码哪里出错了。原先代码如下:var userinfo = null; function showuser() { var userid = 10001; getuserinfobyajax(userid); showuserinfo(); } function getuserinfobyajax(userid) { var random = math.random(); winjs.xhr({url:"http://localhost:50623/userinfo.aspx?userid="+userid+"&t="+rand}) .done(function complete(result) { //set the userinfo. userinfo = json.parse(result.responsetext); }, function error(result) { console.log(result.responsetext); }); } function showuserinfo(){ document.getelementbyid("username").innerhtml=userinfo.username; document.getelementbyid("hometown").innerhtml=userinfo.hometown; }
自己一股劲的在调试,但是界面一直不
显示username和hometown,断点显示userinfo为null。但是在getuserinfobyajax()方法体里面
userinfo确实取得了服务器返回的数据。因为前端和后台代码都是自己写,所以有时真不确定是哪头的代码出了问题,所以有时单元测试特别的重要。这里
又要提到web api,等项目结束之后把后台的代码重构为web api出来。
其实这个问题新手很容易范,因为
getuserinfobyajax(userid);在showuserinfo();
之前,所以肯定是先获得了userinfo,但是为什么在showuserinfo()里面的userinfo为null。我在写代码时,把ajax异步
请求的概念忘了,winjs.xhr()发送请求之后不能马上获得数据,这就是异步。所以在代码执行到showuserinfo()内部时,可能
userinfo还没有重新赋值,所以还是null。旁边的同事帮我看了一眼就发现我的错误做法。
在获得ajax数据之后要执行的事情全部要放到ajax成功方法体内,代码如下:function getuserinfobyajax(userid) { var random = math.random(); winjs.xhr({url:"http://localhost:50623/userinfo.aspx?userid="+userid+"&t="+rand}) .done(function complete(result) { //set the userinfo. userinfo = json.parse(result.responsetext); showuserinfo(); }, function error(result) { console.log(result.responsetext); }); }
程序运行正常。从以上来看,我们在web开发过程中,很多问题都是由于我们对基础概念掌握的不好,或者忽略了最基本的概念,等到程序代码一多,问题就显得非常多,并且自己经常处在“不识庐山真面目,只缘身在此山中”。一直在自己写的错误代码里面打转。