如何避免使用setTimeout来等待Promise解决?

我有一个subreddit我想parsing所有日常线程的意见。 要做到这一点,我必须得到线程ID。 我使用snoowrap作为api包装。

我正在困难地考虑节点的asynchronous性。 当我打电话给subreddit.search({query: 'Daily General Discussion - ' + date}) ,我得到一个承诺

然后我解决承诺获得线程ID并推送到一个新的数组(我试着用arr[i] = a[0].id保存值,但只有最后的结果被存储在我的数组, Promise.resolve在我的for循环之后被调用)。

如何在Promise解决之前停止执行其余的代码? 使用setTimeout似乎效率低下,不可靠,因为parsing时间可能比我的setTimeout时间长。

下面的代码工作,我只是想避免使用setTimeout。

 const subreddit = reddit.getSubreddit('subreddit') let numberOfDaysBack = 50; let arrIds = new Array(0); for (var i = 0; i < numberOfDaysBack; i++) { let date = moment().subtract(0+i, 'days').format('MMMM D, YYYY') let dailyThread = subreddit.search({query: 'Daily General Discussion - ' + date}) Promise.resolve(dailyThread).then(a=>{ arrIds.push(a[0].id) }) } setTimeout(function(){ console.log(arrIds) },1000) doOtherStuff(arrIds) 

       

网上收集的解决方案 "如何避免使用setTimeout来等待Promise解决?"

Promise.all()映射到数组中,然后使用Promise.all()同时运行它们。 所有的承诺都解决后,你会得到结果。

 const subreddit = reddit.getSubreddit('subreddit') let numberOfDaysBack = 50 let arrIds let promises = Array(numberOfDaysBack) .fill() .map((_, i) => { let date = moment().subtract(0+i, 'days').format('MMMM D, YYYY') let dailyThread = subreddit.search({query: 'Daily General Discussion - ' + date}) return dailyThread }) Promise .all(promises) .then(results => { arrIds = results.map(result => result.id) doOtherStuff(arrIds) }); 

将所有的promise保存在一个数组中,然后使用Promise.all

 const subreddit = reddit.getSubreddit('subreddit') let numberOfDaysBack = 50; let idPromises = []; for (var i = 0; i < numberOfDaysBack; i++) { let date = moment().subtract(i, 'days').format('MMMM D, YYYY') let dailyThread = subreddit.search({query: 'Daily General Discussion - ' + date}) idPromises.push(dailyThread.then(a => a[0].id)); } Promise.all(idPromises).then(arrIds => { console.log(arrIds) }); 

在这种types的用例中,您可以使用Promise.all(),您必须创build承诺列表并等待所有承诺完成。

 const subreddit = reddit.getSubreddit('subreddit'); const numberOfDaysBack = 50; const arrIds = new Array(0); const promises = []; for (var i = 0; i < numberOfDaysBack; i++) { const date = moment().subtract(0+i, 'days').format('MMMM D, YYYY'); const dailyThread = subreddit.search({query: 'Daily General Discussion - ' + date}); promises.push(dailyThread); } Promise.all(promises).then(function(results){ results.forEach(function(a){ arrayIds.push(a[0].id); }); console.log(arrayIds); }); 

假设subreddit.search返回一个Promise

 const subreddit = reddit.getSubreddit('subreddit') let numberOfDaysBack = 50; Promise.all(Array.fill(numberOfDaysBack).map((unused, i) => { let date = moment().subtract(0+i, 'days').format('MMMM D, YYYY') return subreddit.search({query: 'Daily General Discussion - ' + date}).then(a => a[0].id); })).then(results => { // here results is the array of "a[0].id" }); // out here, don't expect to access results without using kludges // so do it all in the `.then`