2016-06-10 5 views
0

У меня возникли проблемы с дизайном, связанные с условиями в сочетании с вызовами ajax в javascript с библиотекой jquery. В зависимости от состояния я хочу сделать какой-то 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 первым. но всегда выполняйте «ПРОЦЕДУРА А». , но это невозможно, конечно, из-за асинхронности.

что-то еще, что мне пришло в голову, это псевдо-аякс-вызов, но я не знаю, как это получится.

благодарит за любую помощь и предложения!

+2

Почему бы не создать функцию procedureA и вызвать это из обещания ajax и в другом? На самом деле нет способа получить последний пример.Если вы не сделаете это своими собственными обещаниями, но вы по-прежнему увидите ту же структуру, что и с if/else – AtheistP3ace

+0

. «Я мог бы, конечно, упаковать процедуру в функцию». Это, вероятно, более чистое, чем все остальное, придумайте. С дополнительным преимуществом вы можете перенести второй вызов ('else') с помощью [' setTimeout (fn, 0) '] (http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes- полезный), так что он всегда называется асинхронно, поэтому вам не придется сложнее диагностировать проблемы позже. –

+0

@ AtheistP3ace, вот что показывает мой первый пример кода. но это то, что мне не нравится дизайн. Как объяснено в моем редактировании - я хочу либо загружать данные из локально хранимого массива (если он существует), либо иным образом с ajax. –

ответ

0

Я нашел лучший ответ (на данный момент) для себя чтение документации JQuery-х $.when() (https://api.jquery.com/jQuery.when/), где я наткнулся на JQuery-х $.Deferred().

Извините, возможно, неясно, спрашивает мой вопрос. Возможно, мой ответ позволяет лучше понять, что мне не понравилось в версии с двумя вызовами функций.

обновление: благодаря DanielB Я упростил код. вместо создания отложенного объекта, который я разрешаю и возвращаю, я просто возвращаю $.when(value). Согласно jQuery docs это рассматривается как решен отложенный объект - так только то, что я хотел:

Если один аргумент передается jQuery.when(), и это не в Отложенный или обещание, это будет обрабатываются как «Отложенные» и « », любые прилагаемые сделанные транзакции будут выполняться немедленно.

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

Нет необходимости создавать отложенный объект. Если вы хотите немедленно разрешить обещание со значением, просто верните '$ .when (value)' на свой собственный. –

+0

@ DanielB oh ok, спасибо - мне было интересно, есть ли более простая возможность. Я попробую это и изменю свой код. –

-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() 
} 
+1

ну, да, но я уже упоминал эту возможность в своем вопросе. –

+0

Если вы используете оператор if с асинхронным вызовом внутри истинного условия, вам нужно будет вызвать функцию в else, если вы хотите, чтобы это выполнялось и под ложным условием. –

+0

По словам всех остальных комментирующих, это правильное решение, почему голос? –

Смежные вопросы