0

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

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

什么有效?

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

什么没有?

好吧,Connect读取callbackand has toreturn一个值到它首先被调用的地方。

我到目前为止的代码

类和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 的调试控制台不返回任何错误。我在这里做错了什么?

4

2 回答 2

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);
});
于 2013-03-02T08:50:43.137 回答
0

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

文档

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

好的,所以我们必须做一个好的老式轮询循环:

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

return returnVal;

它专门破坏了 jquery 调用的异步特性(“AJAX”中的第一个“A”),但如果这是您需要的功能,这将让您到达那里。

于 2013-03-02T09:08:33.083 回答