首页 新闻 赞助 找找看

Jquery 中如何在确定某个异步方法没有返回值的时候该方法不执行?

0
悬赏园豆:10 [已关闭问题] 关闭于 2015-09-18 17:54

各位朋友请帮帮忙,初学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);
                    }
                });
            }
        }
    }
})();

万望赐教

Dino H.Y的主页 Dino H.Y | 初学一级 | 园豆:151
提问于:2013-07-10 14:01
< >
分享
所有回答(1)
0

在获取IP的异步获取数据中的

success: function (state) {

//里面写log方法

}

这样就不用等待2秒后再执行这个log方法。

度一 | 园豆:226 (菜鸟二级) | 2014-01-26 14:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册