使用return语句的nodejs异步函数

时间:2019-09-17 14:01:10

标签: node.js asynchronous async-await

当前,这是我的代码:

async function getUser(ID){
    //Code for Building SQL query
    return await getUserFromDb(query);
}

我刚刚安装了eslint,并且我读到在return语句中写“ await”是没有用的,这只会减慢功能。 从返回行中删除await后,它说我的异步函数中没有await

我还需要使函数异步吗?在我的主要功能中,我叫user = await getUser();。从这里和从函数中删除等待是否正确?会不会是ansyc?


这是

async function getUser(ID){
    //Code for Building SQL query
    return await getUserFromDb(query);
}

async function main(){
    console.log("User 1: test");
    console.log("User 2: " + await getUser(424).Name);
    console.log("User 3: test");
}

与这个相同吗?:

function getUser(ID){
    //Code for Building SQL query
    return getUserFromDb(query);
}

async function main(){
    console.log("User 1: test");
    console.log("User 2: " + getUser(424).Name);
    console.log("User 3: test");
}

4 个答案:

答案 0 :(得分:1)

此:

async function getUser(ID){
    //Code for Building SQL query
    return await getUserFromDb(query);
}

或者这个:

async function getUser(ID){
    //Code for Building SQL query
    return getUserFromDb(query);
}

基本上与此相同:

function getUser(ID){
    //Code for Building SQL query
    return getUserFromDb(query);
}

有一个小小的例外。如果getUserFromDb()要同步抛出,那么async版本将捕获该异常并将其转变为被拒绝的承诺。非异步版本将同步返回给调用者。

没有理由做return await someFuncThatReturnsPromise()。您可以只执行return someFuncThatReturnsPromise()而已,除了获得更有效的代码外,结果没有任何区别。

  

我还需要使函数异步吗?

可能不是。如果getUserFromDb()的行为正确且没有同步抛出,则没有理由制作函数async。您可以退还已经拥有的诺言。

  

在我的主要函数中,我称用户= await getUser();。从这里和从函数中删除等待是否正确?会不会是ansyc?

您将需要使用await getUser()getUser().then(...)getUser()获取值。这取决于您要使用的编码样式首选项。如果使用await getUser(),则它必须来自async函数。如果使用getUser().then(...),则包含函数不必为async

答案 1 :(得分:0)

此:

async function getUser(ID){
    //Code for Building SQL query
    return await getUserFromDb(query);
}

既不需要async也不需要await

由于您已经在等待getUserFromDb,因此假定它已经返回了Promise,如果它是带有async标记的函数,则显式或隐式返回。

所以您可以这样做:

function getUser(ID){
    //Code for Building SQL query
    return getUserFromDb(query);
}

然后:

await getUser(ID)

答案 2 :(得分:0)

如果您的异步函数刚刚返回,则等待一个诺言,然后返回其结果,实际上与使函数同步然后返回诺言的效果相同。 仅在必须等待内部promise解析并在返回之前对结果采取行动之前,或者需要在函数内部等待多个promise时,才需要使函数异步。

async function thisDoesntMakeSense() {
  return await someAsyncCall();
}

function thisDoes() {
  return someAsyncCall();
}

// Later down the line you can just await this call:
const result = await thisDoes();

async function thisIsProperUseOfAsync() {
  const asyncCallResult = await someAsyncCall();
  return asyncCallResult + 1; //Because you operate on the result of an async call
}

async function thisAlsoMakesSense() {
  const firstReslt = await firstAsyncCall();
  return await secondAsyncCall(firstResult);
}

答案 3 :(得分:0)

正确的版本实际上是:

function getUser(ID){
    //Code for Building SQL query
    return getUserFromDb(query);
}

async function main(){
    let user = await getUser(424)
    console.log("User 1: test");
    console.log("User 2: " + user.Name);
    console.log("User 3: test");
}

因为我假设“ getUserFromDb”返回一个承诺(是异步的)。 “ getUser”功能从“ getUserFromDb”同步返回承诺,然后您异步在main中等待该承诺。