2017-10-28 70 views
0

我想創建多個承諾,而且我真的不關心這段代碼中的種族,只要所有的回調都完成了。Node.js:單個變量,多個承諾

所以,我有一個變量,它包含所有的數據,讓我們說:

export interface IData { 
    data1: string[], 
    data2: string[], 
    data3: string[] 
} 

這3個是無關的,我有一個數據提取器..說:

function getData(id: string): Promise<IData> { 
    return new Promise((resolve, reject) => { 
     var data = new TableFetcher(); 
     data.get(_id) 
     .then((result : IData) => { 
      resolve() 
     }) 
    }) 
} 

現在,我想做成這樣的:

function x(): Promise<IData> { 
    return new Promise((resolve,reject) => { 
     var data: IData = { 
      data1: getData('100'), 
      data2: getData('200'), 
      data3: getData('300') 
     } 
     resolve(data) 
    }) 
} 

當所有getData承諾已完成。

它不需要鏈,但所有可以單獨運行,但我需要返回一個包含所有異步數據完成後的數組。

我該怎麼做?

回答

5
  1. 避免Promise constructor antipattern
  2. 使用Promise.all,使對結果的承諾,從承諾的數組:

function getData(id: string): Promise<string[]> { 
    return new TableFetcher().get(id); 
} 
function x(): Promise<IData> { 
    return Promise.all([ 
     getData('100'), 
     getData('200'), 
     getData('300') 
    ]).then(([data1, data2, data3]) => { 
     return <IData>{data1, data2, data3}; 
    }); 
} 
+0

啊...謝謝你.. – Magician

+0

我看到'promise.all'結構,但我在那裏找不到'拒絕'。我如何向x()的調用者發送'reject'? – Magician

+1

@Magician如果傳遞給Promise.all()的任何承諾被拒絕,那麼產生的承諾也將被拒絕。 – Thomas

-1

function x(): Promise<IData> { 
 
    return new Promise((resolve, reject) => { 
 
     Promise.all([getData('100'), getData('200'), getData('300')]) 
 
      .then(result => { 
 
       var data: IData = { 
 
        data1: result[0], 
 
        data2: result[1], 
 
        data3: result[2] 
 
       } 
 
       resolve(data) 
 
      }) 
 
      .catch(err => { 
 
       reject(err) 
 
      }) 
 

 
    }) 
 
}