如何在JavaScript中同步打印承诺?

如何在JavaScript中同步打印承诺?,javascript,Javascript,我让下面的函数返回一个承诺,它解析为一个随机单词字符串。我有一个从1到10的for循环。每次迭代,如果数字是3的倍数,我需要打印“除法”,否则打印一个随机单词。问题是所有随机数都在for循环的末尾打印,而不是按顺序打印。我尝试使用“await”,但它说“await仅在异步函数中有效”。我怎样才能完成这项任务?(我需要保持getRandomWord函数的原样) const randomWords=require('random-words'); 函数getRandomWord(){ 返回新承诺((

我让下面的函数返回一个承诺,它解析为一个随机单词字符串。我有一个从1到10的for循环。每次迭代,如果数字是3的倍数,我需要打印“除法”,否则打印一个随机单词。问题是所有随机数都在for循环的末尾打印,而不是按顺序打印。我尝试使用“
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;i
const 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 scope
let
解决的。我使用了let-in-for-loop。这也是一个很好的捕获,但是OP的问题是
控制台。log
s没有顺序。问题是:“问题是所有随机数都打印在for循环的末尾,而不是顺序。”@Felix知道了。谢谢我会更新我的答案。这是一个创建承诺的更好的方法,但它不能解决OP的循环问题。循环问题是通过使用block scope
let
解决的。我使用了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)