我在javascript和jquery库中遇到了关于条件和ajax调用的设计问题。 根据条件我想做一些ajax调用然后执行一个过程 - 或者我执行相同的过程而不用ajax调用。
编辑1;更加具体的我想达到的目标:
取决于某些对象数据是否已存在,我要么从本地对象数组加载,要么用ajax加载。
我想出了这个结构:
if(x)
{
$.ajax({
url: "interface.php",
type: "GET",
dataType: "json",
data:{
my_data : testvalue
}
})
.done(function(data){
/* PROCEDURE A */
});
}
else
{
// same procedure
/* PROCEDURE A */
}
我不喜欢我必须在这里重复完全相同的代码。我当然可以将程序打包成一个函数,但这不会改变设计。
我想有这样的结构:
if(x)
{
$.ajax({
url: "interface.php",
type: "GET",
dataType: "json",
data:{
my_data : testvalue
}
});
}
/* PROCEDURE A*/
所以,如果x == true
首先进行ajax调用。但总是做“程序A”。
但这当然是不可能的,因为它的异步性。
我想到的其他东西是伪ajax调用,但我不知道这会如何解决。
感谢您的任何帮助和建议!
答案 0 :(得分:0)
我找到了最好的答案(此时此刻),我自己阅读了jQuery $.when()
(https://api.jquery.com/jQuery.when/)的文档,我偶然发现了jQuery的$.Deferred()
。
很抱歉可能不清楚问我的问题。也许我的答案让我更好地理解我对两个函数调用版本的不喜欢。
更新:感谢DanielB我简化了代码。而不是创建我解决和返回的延迟对象,我现在只返回$.when(value)
。根据{{3}},这被视为已解决的延迟对象 - 所以正如我想要的那样:
如果将单个参数传递给jQuery.when()并且它不是 延期或承诺,它将被视为已解决的延期和 附加的任何doneCallbacks将立即执行。
function call(x)
{
if(x)
{
return $.ajax({
url: "deferred.json", //contains: {"name":"bob"}
dataType: "json",
method: "GET"
});
}
else
{
// my "pseudo ajax":
return $.when({"name":"john"});
}
}
var my_x = true;
// if my_x == true then ajax is called to receive data
// if my_x == false then my deferred object can answer with local data instead
call(my_x)
.done(function(data){
procedureA(data);
})
.fail(function(){
alert("error: ajax request failed");
});
这个解决方案看起来更线性,对我来说不那么笨拙。由于我使用延迟对象模拟ajax调用,因此我可以以完全相同的方式处理两个(甚至多个)情况。此外,代码不会过多分支。
答案 1 :(得分:-1)
这个怎么样?
function procA(){
/*some code here*/
}
if(x)
{
$.ajax({
url: "interface.php",
type: "GET",
dataType: "json",
data:{
my_data : testvalue
}
})
.done(function(data){
procA()
});
}
else
{
// same procedure
procA()
}