代码之家  ›  专栏  ›  技术社区  ›  user1517566

使用async/await语法没有意义[重复]

  •  0
  • user1517566  · 技术社区  · 3 年前

    我试图学习async/await语法,但没有取得任何进展。我在下面有一个片段,到目前为止,它会将此返回到控制台。这个想法是,如果我的地图上没有特定的键,它会发出一个调用——等待响应——然后继续。相反,我只是得到了承诺。任何关于我哪里出错的建议都将不胜感激。

    enter image description here

        // mymap is a global var
    async function retrieveDetails(key){
        let url = '/myurl);
        let res = '';
        const response = await fetch(url, {
            headers: {
            'Content-Type': 'application/json',
            'Authorization' : 'Bearer '+accessToken
            }
        })
        .then((response) => {
            mymap.put(key, response);
        })
    }
    
    function getValue(key){
        if(!mymap.has(key)){
            retrieveDetails(key);
        }
        return mymap.get(key); 
    }
    
    let result = getValue('foo'); // should return me a value from mymap.
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Samathingamajig    3 年前

    只是因为你使用 await 的内部 retrieveDetails 这并不意味着当你打电话的时候 检索详细信息 它将等待 检索详细信息 要做(事实上永远不会,除非你 等候 .then 它)。

    getValue 需要成为 async 函数(哪个implicity返回一个 Promise ),或返回 许诺 作为一个同步函数,能够解析为您想要的值。

    有了承诺,

    function getValue(key){
        if(!mymap.has(key)){
            return retrieveDetails(key).then(() => mymap.get(key));
        }
        return Promise.resolve(mymap.get(key)); 
    }
    

    具有 异步

    async function getValue(key){
        if(!mymap.has(key)){
            await retrieveDetails(key);
        }
        return mymap.get(key); 
    }
    

    无论哪种方式,您都需要更改接收数据的方式:

    let result = await getValue('foo');
    
    // or
    
    getValue('foo').then((result) => {
      // rest of code
    });