我正在尝试一些面向对象的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的调试控制台不会返回错误。 我在这里做错了什么?
答案 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”),但如果这是你需要的功能,那么这将帮助你。