jQuery Mobile Function无法返回(OO)

时间:2013-03-02 08:46:31

标签: jquery oop jquery-mobile

我正在尝试一些面向对象的jQuery,但我没有走得太远。 我创建了两种方法;

  • DoConnect - > AJAX请求检查URL是否可用。 如果连接成功,则callback(true),如果连接成功,则callback(false) 失败。
  • Connect - >从需要调用的地方调用。

什么有效?

DoConnect尝试连接到主机并发送callback。这很好用。 Connect读取此callback,也正常工作。 (我通过添加alert来测试这个来返回callback的布尔值)

什么不是?

好吧,Connect读取callback,并且必须return一个值,以便首先调用它。

到目前为止我的代码

该课程和Connect方法

var Class = 
{
    Connect : function(host, apikey)
    {
        var returnVal;

        DoConnect(host, apikey, function(res)
        {
            if (res)
            {
                // alert('TRUE');
                returnVal = true;
            }
            else
            {
                // alert('FALSE');
                returnVal = false;
            }
        });

        return returnVal;
    }
}

DoConnect方法

var DoConnect = function(host, apikey, callback)
{
    $.ajax({
        type: 'GET',
        url: host + "/api?do=ping&" + apikey,
        dataType: 'jsonp',
        success: function(e)
        {
            if (e.status != undefined)
            {
                callback(false);
            }
            else
            {
                callback(true);
            }
        }
    });
}

我这样称呼它;

var IsConnected = Class.Connect(host, apikey);
alert(IsConnected) // Returns undefined.

Chrome的调试控制台不会返回错误。 我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您的returnVal会在回答之前返回。返回值是异步的,你必须保持整个链的异步。

您还需要向Connect函数添加回调,例如:

Connect : function(host, apikey, callback)

然后在DoConnect函数的回调中调用回调:

        if (res)
        {
            // alert('TRUE');
            return callback(true);
        }
        else
        {
            // alert('FALSE');
            return callback(false);
        }    

您可以调用您的函数,如:

Class.Connect(host, apikey, function(returnValue) {
    alert(returnValue);
});

答案 1 :(得分:0)

在返回值之前,您需要等待ajax调用完成。这可以通过将async选项设置为false来实现,例如......哦等等,不,它不能。

来自the docs

  

跨域请求和dataType:“jsonp”请求不支持同步操作。

好的,所以我们必须做一个好的老式民意调查循环:

... // after $.ajax call
while(typeof(returnVal) === "undefined");

return returnVal;

它明确地破坏了jquery调用的异步性质(“AJAX”中的第一个“A”),但如果这是你需要的功能,那么这将帮助你。