【问题标题】:How to write fetch synchronously?如何同步编写fetch?
【发布时间】:2020-11-28 15:51:51
【问题描述】:

我是 javascript/typescript 的新手,我使用 typescript 编写二十一点应用程序,在一个玩家游戏中,我将机器人作为第二个玩家。 他的脚本是这样的:

        const botTurn = (bot : Player) =>{
            while(bot.Points < 21)
            {
                if(bot.Points < 18)
                {
                    hitMe();
                }
                else
                {
                    var random = Math.random();
                    if(random < 0.5)
                    {
                        hitMe();
                    }
                    else{
                        break;
                    }
                }
            }

            stay();
        }

hitMe 看起来像这样:

        const hitMe = () =>
        {
            fetch('https://deckofcardsapi.com/api/deck/' + deckId + '/draw/?count=1')
            .then(response => response.json())
            .then(data => {
                deckLenght = data.remaining;
                for(let card of data.cards)
                {
                    var newCard = getCardData(card);
                    players[currentPlayer].Hand.push(newCard);
                    renderCard(newCard, currentPlayer);
                    updatePoints();
                    updateDeckLenght();
                    check();
                }
            });
        }

所以 botTurn 不会等待 hitMe 完成并且我的浏览器挂起 如何解决?

【问题讨论】:

标签: javascript typescript


【解决方案1】:

您可以使用 Async/await,它会更适合您的情况并且更容易

const hitMe = async () =>
        {
         let response = await fetch('https://deckofcardsapi.com/api/deck/' + deckId + '/draw/?count=1');
              let data = await response.json();
                deckLenght = data.remaining;
                for(let card of data.cards)
                {
                    var newCard = getCardData(card);
                    players[currentPlayer].Hand.push(newCard);
                    renderCard(newCard, currentPlayer);
                    updatePoints();
                    updateDeckLenght();
                    check();
                }
            });
        }

【讨论】:

  • 是的,但不是,async/await 的相关用法将在 botTurn 中而不是在 hitMe 中(其中 OP 可以只是 return 承诺链)跨度>
  • 当我使用异步时,我得到了这个错误:ES5/ES3 中的异步函数或方法需要 'Promise' 构造函数。确保您有“Promise”构造函数的声明或在您的 --lib 选项中包含“ES2015”。
  • 但我没有在哪里更改此选项
  • @Dante 这可能会让你感兴趣:stackoverflow.com/q/45422573/1915893 这是一个缺失的属性而不是缺失的对象,但解决方案是一样的。
【解决方案2】:

您不能期望通过将异步操作包装为同步操作来获得基于同步的作用域值。

虽然你可以尝试在解析器中完成你的逻辑,即:then(result)

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 2018-12-04
    • 2016-07-02
    • 2019-08-20
    • 2012-10-04
    • 2019-01-25
    • 2011-06-26
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多