1

データの配列(csvファイル)に対して呼び出される文字列としてjavascriptスニペットを渡しています。最初の行を完了した後でのみ、次の行を評価したい:

CoffeeScript(javascriptにコンパイルされ、ブラウザーで実行されます):

for row in rest
  map = makeMap header,row
  json = JSON.stringify map
  eval "((#{fn})(#{json}))"

Javascriptスニペット(文字列として保存):

function(map) {
  console.log(map.customer_id);
  $.ajax("http://localhost:3000/data/" + map.customer_id,
         function(data) { console.log(data);});
}

done()Jasmine BDDまたは他のjavascriptテストフレームワークにある実装をどのように行うのですか?

4

2 に答える 2

1

その関数がどのフレームワークからのものであるかによって$.ajaxは、AJAXを同期させるためにパラメーターを渡すことができる場合があります。

ただし、すべての非同期関数に非同期モードに切り替えるオプションがあるわけではありません。その場合、実行する唯一の方法は、コールバックを呼び出すことです(ハードコードされているか、パラメーターとして)。残念ながら、そのforループを再帰関数に書き直す必要があります(またはそれを行う非同期ライブラリを使用します)。

var i = 0;
function processItems(i){
   if(i >= rest.length){
      return whatToDoNext();
   }else{
      runMyAsyncCode(function(){
         proccessItems(i+1);
      })
   }
}
于 2013-03-06T18:43:09.550 に答える
0

通常、多くの手間をかけずにjavascriptを同期的に実行することはできません。ただし、たとえば、promise(関数によって返される最終的な値を表すオブジェクト)を使用して、同期して実行されているように見せることができます。jqueryのドキュメントでpromise(jqueryでは遅延オブジェクトと呼ばれます)を確認できます。

これは、jqueryの遅延オブジェクトを使用するajaxハンドラーがどのように見えるかです(done関数の使用に注意してください)

$.ajax("http://localhost:3000/data/" + map.customer_id).done(function(data) {
    console.log(data);});
});
于 2013-03-06T19:28:19.557 に答える