如何在JavaScript中同步打印承诺?
我让下面的函数返回一个承诺,它解析为一个随机单词字符串。我有一个从1到10的for循环。每次迭代,如果数字是3的倍数,我需要打印“除法”,否则打印一个随机单词。问题是所有随机数都在for循环的末尾打印,而不是按顺序打印。我尝试使用“如何在JavaScript中同步打印承诺?,javascript,Javascript,我让下面的函数返回一个承诺,它解析为一个随机单词字符串。我有一个从1到10的for循环。每次迭代,如果数字是3的倍数,我需要打印“除法”,否则打印一个随机单词。问题是所有随机数都在for循环的末尾打印,而不是按顺序打印。我尝试使用“await”,但它说“await仅在异步函数中有效”。我怎样才能完成这项任务?(我需要保持getRandomWord函数的原样) const randomWords=require('random-words'); 函数getRandomWord(){ 返回新承诺((
await
”,但它说“await仅在异步函数中有效”。我怎样才能完成这项任务?(我需要保持getRandomWord函数的原样)
const randomWords=require('random-words');
函数getRandomWord(){
返回新承诺((解决)=>{
设置超时(
()=>解析(随机词())
);
});
}
对于(i=1;i{
console.log(i+“:”+结果);
});
}
}
输出
3:分开
6:分开
9:分开
11:图表
11:定义
11:建议
11:stone
11:打赌
11:马戏团
11:课堂您的循环应该在异步函数中,并等待调用
getRandomWord
async function doWork()
{
for (i=1; i<=10; i++) {
if (i%3 === 0) {
console.log(i + ": " + "divided" );
}
else {
var result = await getRandomWord()
console.log(i + ": " + result);
}
}
}
异步函数doWork()
{
对于(i=1;i{
设置超时(
()=>解决(“你好,世界”)
);
});
}
异步函数doWork()
{
对于(i=1;i您的循环应该在异步函数中,并等待调用
getRandomWord
async function doWork()
{
for (i=1; i<=10; i++) {
if (i%3 === 0) {
console.log(i + ": " + "divided" );
}
else {
var result = await getRandomWord()
console.log(i + ": " + result);
}
}
}
异步函数doWork()
{
对于(i=1;i{
设置超时(
()=>解决(“你好,世界”)
);
});
}
异步函数doWork()
{
对于(i=1;iconst test=async()=>{
for(设i=1;i{
console.log(i+“:”+结果);
});
}
}
}
测试()
。然后(()=>console.log('success'))
.catch(console.error)
const test=async()=>{
for(设i=1;i{
console.log(i+“:”+结果);
});
}
}
}
测试()
。然后(()=>console.log('success'))
.catch(console.error)
您可以通过使用来实现。我建议不要使用setTimeout
我找不到使用setTimeout
的任何目的。它将不必要地向事件循环添加回调
这是问题中提到的不同方法,也许它能有所帮助
为了清楚地说明它的工作原理,我添加了自己的randomWords
函数。您可以在该函数中添加randomWords
逻辑
函数*randomWords(){
var nextVal;
while(true){
nextVal=parseInt(Math.random()*100+1);
收益率nextVal;
}
}
设i=1;
for(randomWords()的var v){
如果(i%3==0){
console.log(i+“:”+“divided”);
}
否则{
控制台日志(i+“:”+v);
}
//不要让循环永远运行!
如果(i>10){
打破
}
i++;
}
您可以通过使用来实现。我建议不要使用setTimeout
我找不到使用setTimeout
的任何目的。它将不必要地向事件循环添加回调
这是问题中提到的不同方法,也许它能有所帮助
为了清楚地说明它的工作原理,我添加了自己的randomWords
函数。您可以在该函数中添加randomWords
逻辑
函数*randomWords(){
var nextVal;
while(true){
nextVal=parseInt(Math.random()*100+1);
收益率nextVal;
}
}
设i=1;
for(randomWords()的var v){
如果(i%3==0){
console.log(i+“:”+“divided”);
}
否则{
控制台日志(i+“:”+v);
}
//不要让循环永远运行!
如果(i>10){
打破
}
i++;
}
(异步函数(){/*for循环和wait here*/}())
。请注意,这不会使承诺同步。这是不可能的。相反,它会使for
循环“wait”直到承诺得到解决,然后再继续下一次迭代。这回答了你的问题吗?@RickardElimää我想我的问题有点不同。因为我必须在这里设置超时…我在选择重复项时意外按下了return。:P(异步函数(){/*for loop with wait here*/}())
。请注意,这不会使承诺同步。这是不可能的。相反,它会使for
循环“wait”直到承诺得到解决,然后再继续下一次迭代。这回答了你的问题吗?@RickardElimää我想我的问题有点不同。因为我必须在这里设置超时…我在选择副本时意外按下了return。:p这是创建承诺的更好方法,但不能解决OP的循环问题em.循环问题是通过使用block scopelet
解决的。我使用了let-in-for-loop。这也是一个很好的捕获,但是OP的问题是控制台。log
s没有顺序。问题是:“问题是所有随机数都打印在for循环的末尾,而不是顺序。”@Felix知道了。谢谢我会更新我的答案。这是一个创建承诺的更好的方法,但它不能解决OP的循环问题。循环问题是通过使用block scopelet
解决的。我使用了let in for loop。这也是一个很好的捕获,但OP的问题是控制台.log
不正常。从e问题:“问题是所有随机数都打印在for循环的末尾,而不是顺序。”@Felix Okay收到了。谢谢,我会更新我的答案。
const test = async () => {
for (let i=1; i<=10; i++) {
if (i%3 === 0) {
console.log(i + ": " + "divided" );
} else {
await getRandomWord().then(result => {
console.log(i + ": " + result);
});
}
}
}
test()
.then(() => console.log('success'))
.catch(console.error)