各位朋友请帮帮忙,初学jquery/js 对里面的东西了解不深。
我的需求如下,需要通过 一个log方法 将参数值以及客户端的IP构建成json然后发送到服务器。
所以我需要获取客户端IP,以及当我获取客户端IP后我需要通过这个IP给这个ip创建一个token以确保,服务器端能够通过这个token与第三方的服务器交换数据。
所以我的设计为:将 客户端ip,token 做为全局变量。在ready()中获取客户端IP,并且获取token的值,并存入全局变量。 以上两步都是异步操作。 接着问题就出现了。当没有获取IP的时候,如果我调用了log方法,这时全局变量没有值,我就会报错。 这时我只能想到的解决办法是在log方法中进行判断,如果全局变量没有值的话我需要等待2秒后再执行这个log方法。
我深感这样坐非常的不好,能否有更好的解决办法呢? 代码如下:
(function () { var userIP,sasToken,isReady; $(document).ready(function ( ) { getUserIP(); }); function getUserIP() { if (!userIP) { $.ajax({ type: "GET", url: "http://jsonip.com?callback=?", dataType: "jsonp", jsonp: "callback", jsonCallback: "jsonCallBack", success: function (data) { callback(data); getSASEveryMinute(); } }); } } function callback(data) { if (data.ip) userIP = data.ip else { sasToken = data.sasToken; isReady = true; } } function getSASEveryMinute() { url = "http://[跨域访问]/SASTokenService.svc/json/Logs/" + userIP; getSAS(); function getSAS() { $.ajax({ url: url, type: 'GET', dataType: "jsonp", jsonp: "callback", jsonpCallback: "jsonCallback", success: function (data) { callback(data); } }); } //每60分钟重新刷新sasToken setInterval(function () { getSAS(); }, 60000); } logging = new function () { this.log = function (data) { var tableEntity = { RowKey: (new Date()).getTime(), Text: data, Type: "log" }; insertEntity(tableEntity); } this.error = function (data) { var tableEntity = { RowKey: (new Date()).getTime(), Text: data, Type: "error" }; insertEntity(tableEntity); } function insertEntity(entity) { if (isReady) { entity.PartitionKey = userIP; insert(entity); } else { //这样的方法很不好,但貌似用When也不好用。。 setTimeout(function () { insertEntity(entity) }, 2000); } function insert() { var jsonText = JSON.stringify(entity); //Can add retry policy here. var url = "/logHandler.ashx" + sasToken; $.ajax({ type: "POST", url: url, contentType: "application/text; charset=utf-8", dataType: "text", //jsonCallBack: "jscallback", data: jsonText, success: function (state) { alert(state); }, error: function (error) { alert(error.statusText); } }); } } } })();
万望赐教
在获取IP的异步获取数据中的
success: function (state) {
//里面写log方法
}
这样就不用等待2秒后再执行这个log方法。