我有一个subreddit,我想解析所有日常线程的注释。为此,我必须得到线程ID。我使用snoowrap作为api包装器。
我很难绕过节点的异步性质。当我致电subreddit.search({query: 'Daily General Discussion - ' + date})
时,我得到了承诺。
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)
答案 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`