2017-09-09 9 views
0

私はJQueryを使ってオブジェクトの配列を回転させ、そのオブジェクトの値が空であるかどうかをチェックしてユーザーがブートボックスを使ってプロンプトウィンドウにその値を入力できるようにします。 。

各文がajax関数を完了した後は、それぞれ洗練されたオブジェクトを保持しておく必要があります。

問題は、ajax関数が各文の実行時に非同期で起動することです。 $ .each文は同期とそれが完了した後、それは実行する必要があります後は何もすることになっているので

$.each(objs,function(k,v){ 

if (v == empty) 
    //prompt bootbox modal to enter the value and (at this time ajax is fired 
    v=bootboxpromptvalue ) 

}) 
$.ajax({ 
.. 
... 
.... 
data:objs 
}) 

質問は、各実行時に、なぜアヤックス火災のですか?

+4

'$を。それぞれは同期的ですが、 '$ .ajax'はそうではありません。それはそうすべきです。 – trincot

+0

それぞれの直後にajaxを実行する方法 –

+0

コードを修正することができます: '' ''が緩やかで、 'each'は現在は無意味なようです:' 'v''を再定義することは配列を変更しません。 'bootboxpromptvalue'とは何ですか?それはブロックされていますか?おそらくそうではないので、そのコードが実行終了した後にのみユーザーにメッセージが表示されます。 – trincot

答えて

0

ブートボックスのプロンプトが非同期であるため、ユーザにプロンプ​​トが表示される前に、$.eachループが続行され、$.ajaxコールが実行されます。この問題を解決するには

、あなたはすぐにあなたが答えをユーザにプロンプ​​トを表示したいと実行を終了する必要がありますし、あなたが答えを持っている場合にのみ、あなたは再び全体のことを試してみてください:

function process() { 
    var isEmpty = false; 
    $.each(objs, function(k,v){ 
     isEmpty = v == empty; 
     if (isEmpty) { 
      bootbox.prompt("Enter value for " + k, function(answer) { 
       objs[k] = answer; 
       // Now we have an answer, try again. 
       process(); 
      }); 
      return false; // break out of `each` 
     } 
    } 
    // Exit if we asked for user input. There will be 
    // a new call to this function later. 
    if (isEmpty) return; 
    // We got everything now, so execute the request 
    $.ajax({ 
     //... 
     data: objs 
    }); 
} 
関連する問題