2017-06-28 9 views
1

私はJavascriptを使い慣れていません。それほど厳しくしないでください:)forループでjQueryを使って2つの関数を順番に実行します。

私は2つの関数を持っていますが、どちらもforループ内でjQuery要求を実行します。例えば、

function a(n,locations) { 
    for (var i = 0; i < n; i ++) { 
    $.ajax({ 
     url: 'https://geocoder.cit.api.here.com/6.2/geocode.json', 
     type: 'GET', 
     dataType: 'jsonp', 
     jsonp: 'jsoncallback', 
     data: { 
     searchtext: input, 
     app_id: APP_ID, 
     app_code: APP_CODE, 
     }, 
     success: function (data) { 
     handleData(data,locations); 
     } 
    }); 
} 

handleData()関数はjQueryのデータから空の配列locationsに変更を加えることになります。私の関数b(m)は類似の形式ですが、更新された場所を入力として使用します。

は今、私はa()b()順を実行したいと考えているc(n,m)を持っている:

function c(n,m) { 
    var locations = []; 
    a(n,locations); 
    b(m,locations); 
} 

私はjQueryの呼び出しを含む順次実行する機能は、.thenとして約束を(使用することによって達成することができることを理解し、前の回答から、 )。しかし、この解決法は、a(n)が約束を返すときにのみ適用可能であり、これはforループ構造の下では達成できない。この問題を解決する方法についての洞察をお寄せください。助けを前にありがとう。

+0

2つの機能を順番に実行していませんか?関数 'c'は' a'を実行し、 'a'は' for'ループを通り、その後 'for'ループが終了すると' b'が起動します。それはあなたが望むものではありませんか? –

+0

@ObsidianAge申し訳ありませんが、私は不明確でした。 'a'では、更新されたバージョンの' b'で使用したい配列 'locations'を更新したいと思います。 –

+0

これがあなたの問題を解決するかどうか教えてください。 –

答えて

1

私はforループの代わりにrecursionを提案します。たとえば、あなたがこのような機能recursionExampleを呼び出すことができ、

function a(n) { 
    return new Promise ((resolve, reject) { 
    (function recursionExample(a) { 
     if (a === n) { 
      resolve; 
     } else { 
      $.ajax({ url: 'https://geocoder.cit.api.here.com/6.2/geocode.json', 
      type: 'GET', 
      dataType: 'jsonp', 
      jsonp: 'jsoncallback', 
      data: { 
       searchtext: input, 
       app_id: APP_ID, 
       app_code: APP_CODE, 
      }, 
      success: function(data) { 
      handleData(data); 
      recursionExample(a + 1); 
      } 
     }); 
     } 
    })(0); 
    }); 
} 

これは、あなたがpromise.thenの機能を使用できるようになります。そうですね...

function c(n,m) { 
    var locations = []; 
    a(n,locations) 
    .then (function() { 
     b(m,locations); 
    }); 
} 
関連する問題