Javascript 我在异步函数中使用承诺是否正确?

Javascript 我在异步函数中使用承诺是否正确?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我终于开始尝试把握承诺了,这是JavaScript中更新且更神秘的一个角落。下面是我在一次技术测试中遇到的一个问题,它似乎触及了我不理解的承诺的核心 问题如下: 您有一个名为Service的预定义类,使用以下方法: generate()-它生成一个介于0和100之间的随机数 guess(yourGuess)-对随机数进行给定猜测,并返回承诺。这个承诺反过来会在100毫秒内完成以下两件事之一: 如果猜测是正确的,承诺将被解析,与该承诺对应的猜测将作为其第一个参数 如果猜测不正确,承诺将被拒绝

我终于开始尝试把握承诺了,这是JavaScript中更新且更神秘的一个角落。下面是我在一次技术测试中遇到的一个问题,它似乎触及了我不理解的承诺的核心

问题如下:

  • 您有一个名为
    Service
    预定义类,使用以下方法:
    • generate()
      -它生成一个介于0和100之间的随机数
    • guess(yourGuess)
      -对随机数进行给定猜测,并返回承诺。这个承诺反过来会在100毫秒内完成以下两件事之一:
      • 如果猜测是正确的,承诺将被解析,与该承诺对应的猜测将作为其第一个参数
      • 如果猜测不正确,承诺将被拒绝
    • 提交(您的猜测)
      -提交您认为正确的猜测
  • 您必须编写一个异步函数,
    main()
    ,该函数将:
    • 使用
      服务
      对象生成随机数
    • 在400毫秒内对同一对象提交正确猜测
    • 任何被拒绝的承诺都必须被抓住
这是我的代码:

const MAX_NUMBER=100;
异步函数main()
{
const service=新服务();
让猜测来冒险;
service.generate();
for(设i=0;i service.submit(guessInPromise));
.catch(err=>console.log(err));
}
回程服务;
}

我的代码能完成任务吗?关于承诺和异步函数,我有什么明显的误解吗?

根据您的要求,我假设任务是以某种方式在400毫秒内猜测正确答案,而每次猜测需要100毫秒。这里一个非常简单的解决方案是并行地进行所有猜测,只等待第一个问题得到解决

这将起作用,因为
Service.guess
被描述为只解析它返回的对有效猜测的承诺(其他将被拒绝)

这里非常有用的是:

例如:

//所述服务类的非常简单的模拟实现
班级服务
{
值=空;
生成(){
this.value=Math.floor(Math.random()*101);
}
猜(你猜){
返回新承诺(((解决、拒绝)=>{
设置超时(()=>{
yourGuess==this.value?解析(yourGuess):拒绝()
}, 100);
}));
}
提交(你的猜测){
返回yourGuess==this.value;
}
}
常数最大值=100;
(异步函数main(){
const service=新服务();
service.generate();
试一试{
//等待第一个答案
const assumedCorrect=等待承诺。任何(
//将0…100映射到服务。猜测(…)
Array.from({length:MAX_NUMBER+1}).map((u,i)=>service.guess(i))
);
console.log(
假设正确,
服务提交(假定正确)
);
}
抓住{
log('没有猜测是正确的…:(');
}

})();
是否
generate()
guess()
返回承诺对象?
const guessInPromise;
没有意义,因为您没有给它一个初始值,以后也不能给它一个值。我认为这里的技巧是使用
服务将所有可能的猜测映射到承诺。guess(…)
然后等待。@crashmstr事实上,它应该只是一个错误-在没有赋值的情况下声明一个常量是没有意义的,而且是一个禁止的语法。这个代码可以运行,但也有一些奇怪的地方。为什么返回
服务
?记录“正确的数字是X”难道没有意义吗。与一大堆浮动承诺不同,最好在猜对后返回一个结果。您的代码当前会立即返回服务对象。编辑:我看到Yoshi打败了我。抱歉。我忘了提到的一件事是,问题指定任何被拒绝的承诺-
guess()如果猜测不正确,则
将拒绝-必须捕获。是否会在
.any()之后粘贴
.catch()
玩这个把戏吗?我现在要更新这个问题。啊,好吧,给我一点时间。不过,考虑到
的承诺。任何
都是有效的,只有在猜测不正确的情况下才会被拒绝。那么哪一个应该被捕获?我添加了一个简单的try/catch块。尽管你需要减少
最大数量
并尝试几次,才能真正触发catch(对于该案例,未做出有效猜测)。