javascript “await”对此表达式的类型没有影响

j5fpnvbx  于 2023-01-24  发布在  Java
关注(0)|答案(5)|浏览(400)

我搜索了这个,但我没有找到任何具体的东西,我需要什么。如果有一个,请在这里分享。
我正在尝试创建一个通用服务,以便在各种组件中调用。由于它是一个从外部源请求数据的函数,因此我需要将其视为异步函数。问题是,编辑器返回消息“'await'对该表达式的类型没有影响”。由于还没有数据,应用程序确实崩溃了。

People.js调用服务请求.js

import React, { useEffect, useState } from "react";
import requests from "../services/requests";

export default () => {

   // State
   const [ people, setPeople ] = useState({ count: null, next: null, previous: null, results: [] });

   // Tarefas iniciais
   useEffect(() => {
       carregarpeople(1);
   }, []);

   // Carregando os dados da API
   const carregarpeople = async (pageIndex) => {
       const peopleResponse = await requests("people", pageIndex);

       // This line below needs to be executed but it crashes the app since I need to populate it with the data from the function requests
       // setPeople(peopleResponse);
   }

   return (
       <div>
       {
           people.results.length > 0 ? (
               <ul>
                   {
                       people.results.map(person => <li key = { person.name }>{ person.name }</li>)
                   }
               </ul>    
           ) : <div>Loading...</div>
       }
       </div>
   )
  }

这是requests.js,它从API返回json

export default (type, id) => {
console.table([ type, id ]);

fetch(`https://swapi.co/api/${type}/?page=${id}`)

.then(response => response.json())
.then(json => {
    console.log(json);
    return json;
})}

z4iuyo4d

z4iuyo4d1#

我得到这个错误只是因为我的JSDoc注解不正确。
例如,我有一个async函数,它包含@returns {string}

/**
   * Fetch from the swapi API
   *
   * @param {string} type
   * @param {string} id
   * @returns {string} JSON
   */
  export default async (type, id) => {
    console.table([ type, id ]);
    const response = await fetch(`https://swapi.co/api/${type}/?page=${id}`);
    const json = await response.json();
    console.log(json);
    return json;
  }

我收到了“'await'对这个表达式的类型没有影响”的警告-但是这个函数看起来是正确的。
然而,一旦我将JSDoc更改为@returns {Promise<string>},错误就消失了:

/**
   * Fetch from the swapi API
   *
   * @param {string} type
   * @param {string} id
   * @returns {Promise<string>} JSON
   */

您还可以使用@async提示,如JSDoc documentation所建议的那样:

/**
 * Download data from the specified URL.
 *
 * @async
 * @function downloadData
 * @param {string} url - The URL to download from.
 * @returns {Promise<string>} The data from the URL.
 */
eeq64g8w

eeq64g8w2#

await只在你使用它的时候才有用,但是requests并不返回一个promise,它根本没有return语句,所以它隐式地返回undefined
看起来你想让它返回一个承诺,所以下面是添加了return的代码:

export default (type, id) => {
  console.table([ type, id ]);
  return fetch(`https://swapi.co/api/${type}/?page=${id}`)
    .then(response => response.json())
    .then(json => {
      console.log(json);
      return json;
    })
}

另外,如果您更喜欢使用async/await执行此操作,则如下所示:

export default async (type, id) => {
  console.table([ type, id ]);
  const response = await fetch(`https://swapi.co/api/${type}/?page=${id}`);
  const json = await response.json();
  console.log(json);
  return json;
}
r6hnlfcb

r6hnlfcb3#

如果您使用typescript得到这个结果,可能是因为您没有返回Promise
例如:

    • 不正确:**
async delPerson (id: string): Partial<Person> {
    return await this.personModel.findByIdAndRemove(id);
}
deletedPerson = await this.personService.delPerson(body._id);
// in above line typescript thinks that he is awaiting for something which is not a promise
    • 正确:**
async delPerson (id: string): Promise<Partial<Person>> {
    return await this.personModel.findByIdAndRemove(id);
}
deletedPerson = await this.personService.delPerson(body._id);
wwwo4jvm

wwwo4jvm4#

在我的例子中,这个问题纯粹与方法的js-doc相关。
我的方法已经有了async修饰符。
原件:

/**
 * bla bla
 * @return {String} bla bla bla
 */

固定:

/**
 * bla bla
 * @return {Promise<String>} bla bla bla
 */
ergxz8rk

ergxz8rk5#

我找到了解决办法。这个建议弹出来是因为你在await关键字后面放了一个错误的对象。你可以通过在await关键字后面放一个promise(不带括号)或者一个返回promise的函数来完全摆脱这个问题。

相关问题