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

时间:2017-10-20 04:13:04

标签: javascript node.js promise

我有一个subreddit,我想解析所有日常线程的注释。为此,我必须得到线程ID。我使用snoowrap作为api包装器。

我很难绕过节点的异步性质。当我致电subreddit.search({query: 'Daily General Discussion - ' + date})时,我得到了承诺。

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

如何在Promise解决之前停止执行其余代码?使用setTimeout似乎效率低且不可靠,因为解析时间可能比我的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)

4 个答案:

答案 0 :(得分:4)

将promises映射到数组中,然后使用 Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.yahoo.com")); startActivity(intent); 同时运行它们。在所有承诺得到解决后,您将在Promise.all()中获得结果。

then

答案 1 :(得分:1)

将所有承诺存储在一个数组中,然后使用Promise.all

curl -X PUT -s -d "{\"passed\": $PASSED}" -u $SAUCE_USERNAME:$SAUCE_ACCESS_KEY https://saucelabs.com/rest/v1/$SAUCE_USERNAME/jobs/$SAUCELABS_SESSIONID

答案 2 :(得分:1)

你可以在这种用例中使用Promise.all(),你必须创建一个promises列表并等待它们全部完成。

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);
});

答案 3 :(得分:1)

假设subreddit.search返回承诺

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`