异步代码 - 条件设计问题

时间:2016-06-10 14:17:24

标签: javascript jquery ajax asynchronous

我在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调用,但我不知道这会如何解决。

感谢您的任何帮助和建议!

2 个答案:

答案 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()
}