48187


現在promiseを使用して非同期なプログラムを書いています．

[code]

    function wait() {
      return new Promise(function (resolve) {
        setTimeout(() => {
          resolve("hey")
        }, 4000)
      })
    }
    
    function loop() {
      promiseList = []
        [1, 2, 3, 4, 5].map(function (index) {
          promiseList.push(wait())
        })
      //5回呼び出されるwait()プログラムのresolveを完了してからreturnしたい．
      return promiseList
    }
    
[/code]

# 問題

  * loop()を呼び出すと，wait関数がresolveした関係なしに，5回ループするとpromiseListをreturnしてしまう．

# 理想動作

  * wait関数が5回resolveされた後にreturnさせたい

# 環境

javascript  
nodeは使用していない


CC BY-SA 4.0
2018-09-07T12:46:21.257
48186
2018-09-07T13:38:42.347
2020-06-17T08:14:45.997
-1
question
javascript promise
promiseの実行順序について


生成された`promiseList`はPromiseオブジェクトを要素とする単なる配列ですので、resolveを暗黙のうちに待ってくれたりはしません。[Promise.all](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)なるAPIを用いて、すべてのPromiseオブジェクトがresolveされたときresolveされる新たなPromiseオブジェクトを生成すれば、期待する動作が得られるでしょう(`op.1`)。  
"理想動作"に関して、もしブロッキング動作をするような書き方を望まれるのであれば、`Promise`のシステムを使いやすく拡張した構文である[async/await](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await)を用いる必要があります(`op.2`)。この構文は古い処理系（ブラウザ・nodeなどのこと）では対応していない可能性があるので、対象の環境が対応しているか確認してください。

[code]

    function wait(idx) {
      return new Promise(function (resolve) {
        setTimeout(() => {
          console.log(idx);
          resolve(`hey(${idx})`);
        }, 100)
      })
    }
    
    // op.1 use 'then' style
    function loop() {
       return Promise.all([1, 2, 3, 4, 5].map(i => wait(i)));
    }
    
    // run
    loop().then(ret => console.log(ret))
    
    // op.2 use 'async/await' style
    async function loop_2() {
        return await Promise.all([1, 2, 3, 4, 5].map(i => wait(2*i)));
    }
    
    // run
    (async () => {
        const ret = await loop_2();
        console.log(ret);
    })();
    
    // 補足：今回の処理内容であれば、loop_2は冗長です
    // runは次のように書いてもよい
    (async () => {
        const ret = await loop();
        console.log(ret);
    })();
[/code]


CC BY-SA 4.0
2018-09-07T13:28:19.367
48187
2018-09-07T13:38:42.347
2018-09-07T13:38:42.347
48186
answer