ES 6 Promiseは並行して実行します.


1.Promise.all並列実行promise
getAとgetBは並行して実行し、結果を出力します.もしまちがいがあったら,まちがいを投げ出す.
/**
 *    promise     resolve     
 *    promise      
 */

const getA = new Promise((resolve, reject) => {
   //      
   setTimeout(function(){
     resolve(2);
   }, 1000) 
})
.then(result => result)


const getB = new Promise((resolve, reject) => {
   setTimeout(function(){
     // resolve(3);
     reject('Error in getB');
   }, 1000) 
})
.then(result => result)


Promise.all([getA, getB]).then(data=>{
    console.log(data)
})
.catch(e => console.log(e));
getAとgetBは並行して実行し、結果を出力します.いつもレスリングの結果を返します.
/**
 *    promise      
 */

const getA = new Promise((resolve, reject) => {
   //      
   setTimeout(function(){
     resolve(2);
   }, 1000) 
})
.then(result => result)
.catch(e=>{

})


const getB = new Promise((resolve, reject) => {
   setTimeout(function(){
     // resolve(3);
     reject('Error in getB');
   }, 1000) 
})
.then(result => result)
.catch(e=>e)


Promise.all([getA, getB]).then(data=>{
    console.log(data)
})
.catch(e => console.log(e));
2.プロミスを順番に実行する
先にtAをGEtBして実行して、最後のaddAB.
  • .1.方法1:thenチェーンを連続的に使用する
  • function getA(){
          return  new Promise(function(resolve, reject){ 
          setTimeout(function(){     
                resolve(2);
            }, 1000);
        });
    }
     
    function getB(){
        return  new Promise(function(resolve, reject){       
            setTimeout(function(){
                resolve(3);
            }, 1000);
        });
    }
     
    function addAB(a,b){
        return a+b
    }
    
    function getResult(){
        var  obj={};
        Promise.resolve().then(function(){
            return  getA() 
        })
        .then(function(a){
             obj.a=a;
        })
        .then(function(){
            return getB() 
        })
        .then(function(b){
             obj.b=b;
             return obj;
        })
        .then(function(obj){
           return  addAB(obj['a'],obj['b'])
        })
        .then(data=>{
            console.log(data)
        })
        .catch(e => console.log(e));
    
    }
    getResult();
    
  • 2.2方法2——promiseを用いてキューを構築する. 
  • function getResult(){
        var res=[];
        //     
        function queue(arr) {
          var sequence = Promise.resolve();
          arr.forEach(function (item) {
            sequence = sequence.then(item).then(data=>{
                res.push(data);
                return res
            })
          })
          return sequence
        }
    
        //     
        queue([getA,getB]).then(data=>{
            return addAB(data[0],data[1])
        })
        .then(data => {
            console.log(data)
        })
        .catch(e => console.log(e));
    
    }
    
    getResult();
    
  • 2.3方法3——async、awaitを使って類似の同期プログラムを実現する
  • function getResult(){
     async function queue(arr) {
      let res = []
      for (let fn of arr) {
        var data= await fn();
        res.push(data);
      }
      return await res
    }
    
    queue([getA,getB])
      .then(data => {
        return addAB(data[0],data[1])
      }).then(data=>console.log(data))
    
    }
    
    3.まとめ
    非同期行列関数を実現する3つの方法
    方法1——thenチェーンを連続的に使用する操作方法2——promiseを使ってキューを構築する方法3——async、awaitを使って類似の同期プログラミングを実現し、async関数内部で同期を実現する.