2013-09-11 2 views
0

Пожалуйста, помогите мне с этим ...2 Последовательное JQuery сообщения, второе выполнены первое

Я должен передать значения в PHP-файл для сохранения, но если был выбран флажок, он должен выполнить второй jquery post с использованием возвращаемого значения из первого. Но похоже, что второй пост jquery выполняется первым, вот мой код:

if($action=="save_prod") 
    { 
     var remember = document.getElementById('chk'); 
     var $suppid=document.getElementById('supp').value; 
     var $categlist=document.getElementById('categlist').value; 
     var $prodname=document.getElementById('prodname').value; 
     var $proddesc=document.getElementById('proddesc').value; 

     $.post(baseurl+'index.php/main/newproduct',{"categlist" : $categlist,"prodname" : $prodname," proddesc" : $proddesc,"supp" : $suppid},function(response) 
     { 
     $lastid=response; 
       if($lastid != 0) 
       { 
        alert("Product has been saved with ID=" + $lastid); 
        document.getElementById('resp').style.display='none'; 
        document.getElementById('fade').style.display='none'; 
        window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid; 
       } 
      }); 

     if (remember.checked) 
     { 
      //alert($lastid); 
      $.post(baseurl+'index.php/main/newitem',{"prodlist" : $lastid ,"itlist" : 0,"itcost" : 0, "supp" : $suppid, "itname" : $prodname, "itunit" : "pc" },function(response) 
      { 
       document.getElementById('resp').style.display='none'; 
       document.getElementById('fade').style.display='none'; 
       //window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid; 
      }); 

     } 
    } 

Большое вам спасибо!

+0

Вы делаете асинхронные вызовы, вы не можете предсказать, какой из них первыми. Вы можете использовать отложенный объект для установки очереди обещаний. Проверьте http://api.jquery.com/category/deferred-object/ – elclanrs

+0

или положите второй пост в обратном вызове первого. – Archer

ответ

2

JQuery Ajax функции ($.ajax(), $.get(), $.post() ...) все возвращают Deferred объект, который обертывает, лежащий в основе jqXHR объекта.

Воспользуйтесь преимуществами Deferred.then() функции в цепи двух асинхронных вызовов:

//your first $.post : 
$.post(...) 
.then(function(){ 
    if (remember.checked) { 
     //your second $.post : 
     $.post(...); 
    } 
}); 

Используя это так, то вторая функция будет вызываться только если первый вызов успешным (ничего не будет срабатывать, если первый вызов приводит к ошибке).


Ваш первый обратный вызов содержит перенаправление: window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;. Вам нужно будет выбрать более точно, когда вы хотите выполнить это перенаправление.

Вот способ, чтобы вызвать перенаправление после второго вызова, если remember проверяется, или сразу после первого звонка, если remember не проверяется, приковав Deferred объекты:

$.post(... /* remove the redirection from the first callback */) 
.then(function(){ 
    if (remember.checked) { 
     //your second $.post : return the Deferred corresponding to this call 
     return $.post(... /* remove the redirection from the second callback */); 
    } else { 
     // else, return the first Deferred object : 
     return this; 
    } 
}).then(function(){ 
    /* do your redirection here : */ 
    window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid; 
}); 

fiddle

+0

Это не выполняет второе сообщение –

+2

Действительно: ваш первый обратный вызов перенаправляется на новую страницу: 'window.location.href = baseurl +" index.php/main/mgtprods /? Key = "+ $ suppid', который остановится js и загрузить новую страницу. – LeGEC

+0

спасибо, я не заметил, что ... –

0

Попробуйте это ...

if($action=="save_prod") { 
    var remember = document.getElementById('chk'); 
    var $suppid=document.getElementById('supp').value; 
    var $categlist=document.getElementById('categlist').value; 
    var $prodname=document.getElementById('prodname').value; 
    var $proddesc=document.getElementById('proddesc').value; 

    $.post(baseurl+'index.php/main/newproduct',{"categlist" : $categlist,"prodname" : $prodname," proddesc" : $proddesc,"supp" : $suppid},function(response) { 
     $lastid=response; 
     if (remember.checked) { 
      //alert($lastid); 
      $.post(baseurl+'index.php/main/newitem',{"prodlist" : $lastid ,"itlist" : 0,"itcost" : 0, "supp" : $suppid, "itname" : $prodname, "itunit" : "pc" },function(response) { 
       document.getElementById('resp').style.display='none'; 
       document.getElementById('fade').style.display='none'; 
       //window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid; 
      }); 
     } 
     if($lastid != 0) { 
      alert("Product has been saved with ID=" + $lastid); 
      document.getElementById('resp').style.display='none'; 
      document.getElementById('fade').style.display='none'; 
      window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid; 
     } 
    }); 
} 

Все, что я сделал, это переместить 2-ой пост в callb ack функции первого. Вы также можете добавить метод .done() к первому сообщению и добавить к нему второй, но он имеет тот же эффект.

+0

Это, похоже, не вызывает второе сообщение ... у вас есть другие предложения? –

+0

Я переместил 2-й пост до 'window.location.href', так что теперь он должен работать нормально. – Archer

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