2017-02-10 9 views
3

私はasync/awaitでこれをやろうとしていますが、解決策はあります。最後.insertBefore()完了するまで.detach()を実行しないようにJquery ajaxコールバックでasyncが待機していますか?

series[group].forEach(async (ele, j) => { 
    await $.ajax({ 
     url: `templates/ele${ele}.template.html`, 
     success: function (data) { 
      const $copyEl = $(el).clone() 
      const r = new RegExp('\\{\\{\\s*' + item + '\\s*\\}\\}', 'g') 
      const html = $copyEl.html().replace(r, data) 

      $(html).insertBefore(parent) 
     }, 
     error: function (e) { 
      console.error(e) 
     }   
     }).then(() => { 
     $(parent).detach() 
     if(i + 1 === outer_last && j + 1=== inner_last) 
      template_callback() 
     }) 
    }) 
}) 

:誰もが、私はこれを変えることができる方法を知っていますか?

+1

'forEach'は同期です。非同期関数についてはわかりません。また、「待つ」と約束を混ぜるのは変です。 –

+0

うーん、私はあなたが 'foo.forEach(async ...)'(各インターレーションでブロックする)ことはできますが 'async foo.forEach(...)'はできないと思っていました)..どんな場合でも、私の心配はここではAJAXコールバックです。 –

答えて

2

地図Promise sのあなたの配列の要素ごと、その後、Promise.allに依存しては:

const promises = series[group].map((ele) => (
    $.ajax({ 
     url: `templates/ele${ele}.template.html`, 
    }).then((data) => { 
     const $copyEl = $(el).clone() 
     const r = new RegExp('\\{\\{\\s*' + item + '\\s*\\}\\}', 'g') 
     const html = $copyEl.html().replace(r, data) 

     $(html).insertBefore(parent) 
    }, (e) => { 
     console.error(e) 
    }) 
)) 

Promise.all(promises).then(() => { 
    $(parent).detach() 
}) 
+0

待っています。私のために 'Promise.all'が何かしていますか? 'insertBefore'が完了するまで待つ必要があります。外側のajax呼び出しではありません。 –

+0

申し訳ありませんが、私のコードを修正しましょう。私はあなたに「成功」​​の方法があることを知らなかった。 – mc10

+0

@robertotomás変更を今すぐお試しください。 – mc10

関連する問題