我只想等待一个进程完成,不想让函数异步。
请看下面的代码。
我必须使 getUserList 异步,因为函数中有一个 await 关键字。因此,我还必须编写类似“await UsersService.getUserList”的代码来执行该方法,而且我还必须使父函数异步。那不是我想做的。
import xr from 'xr' //a package for http requests
class UsersService {
static async getUserList() {
const res = await xr.get('http://localhost/api/users')
return res.data
}
}
export default UsersService
import UsersService from './UsersService'
class SomeClass {
async someFunction() { //async again!!
const users = await UsersService.getUserList() //await again!!
}
}
最佳答案
这是设计选择吗?
这是因为 JavaScript 的同步特性。如果你想让一个函数同步运行一个异步命令,它会阻塞整个程序,这是非常不可取的,如果它是客户端就很糟糕,如果它是服务器端就很糟糕。出于这个原因,存在 async
函数。这些功能从正常流程中取出,这就是 await
起作用的原因。
为什么?
另一个原因是 await
+async
是 promises 的语法糖。 Promises 是异步的,你无法阻止它。这意味着 await 不会使异步函数同步,它只是暂停 await 函数的其余部分,直到它完成。如果它确实阻塞了整个事件循环,想象一下如果您想创建一个可以在客户端之间发送数据的应用程序。每次发出异步请求时,您的整个服务器应用程序都会挂起,而不是仅仅使单个请求异步。
所以这样想:
您不是在使异步函数同步,而是在使程序的其余部分异步以应对它。
因此,与其将 async
视为 await
的要求,不如将它们视为组合(async
+await
) 因为这就是它们的基本工作方式。如果您想了解有关异步和等待的更多信息,我强烈建议您阅读我的 blog article对此进行了深入研究。
关于javascript - 为什么我必须将 async 关键字放在具有 await 关键字的函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38320610/