回答編集履歴
1
説明の改善
    
        answer	
    CHANGED
    
    | 
         @@ -44,15 +44,14 @@ 
     | 
|
| 
       44 
44 
     | 
    
         
             
            array = divide(array, 3)
         
     | 
| 
       45 
45 
     | 
    
         
             
            array = array.map(val => val.map(val2 => main(val2)))
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
            //ここまで!あえてreduceループさせている処理を省いてます。
         
     | 
| 
      
 47 
     | 
    
         
            +
            //ここまで!あえてpromisewrapperに加工している処理と、reduceループさせている処理を省いてます。
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
            ```
         
     | 
| 
       50 
50 
     | 
    
         
             
            navcaさんの想像とは違う挙動になっていると思います。
         
     | 
| 
       51 
51 
     | 
    
         
             
            console.logが実行され、setTimeoutも実行されているのが確認できたと思います。
         
     | 
| 
       52 
52 
     | 
    
         
             
            恐らく、navcaさんは`Promise`の引数はcallback関数のイメージだったのではないでしょうか。
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
            `Promise`は処理の終了を教えてくれる、resolve,rejectされるまで待つ、という仕組みなだけでして、
         
     | 
| 
      
 54 
     | 
    
         
            +
            `Promise`は処理の終了を教えてくれる、resolve,rejectされるまで待つ、という仕組みの1パーツなだけでして、遅延評価される関数を包み込んだオブジェクト?(言葉の表現が下手ですみません)ではありません。この勘違いがなくなれば、きっとreduceを使ったPromiseなループ処理も怖くなくなると思います。
         
     | 
| 
       55 
     | 
    
         
            -
            この勘違いがなくなれば、きっとreduceを使ったPromiseなループ処理も怖くなくなると思います。
         
     | 
| 
       56 
55 
     | 
    
         | 
| 
       57 
56 
     | 
    
         
             
            理解の助けになるように、navcaさんの関数定義をそのまま使った場合で修正しますと・・・
         
     | 
| 
       58 
57 
     | 
    
         
             
            ```js
         
     |