await 仅在异步函数中有效

IT技术 javascript node.js
2021-01-23 14:20:20

我写了这段代码 lib/helper.js

var myfunction = async function(x,y) {
   ....
   return [variableA, variableB]
}
exports.myfunction = myfunction;

然后我尝试在另一个文件中使用它

 var helper = require('./helper.js');   
 var start = function(a,b){
     ....
     const result = await helper.myfunction('test','test');
 }
 exports.start = start;

我有一个错误

“await 仅在异步函数中有效”

问题是什么?

6个回答

错误不是指myfunction而是指start

async function start() {
   ....

   const result = await helper.myfunction('test', 'test');
}

// My function
const myfunction = async function(x, y) {
  return [
    x,
    y,
  ];
}

// Start function
const start = async function(a, b) {
  const result = await myfunction('test', 'test');
  
  console.log(result);
}

// Call start
start();



我利用这个问题的机会向您提供有关使用的已知反模式的建议await: return await


错误的

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later

// useless async here
async function start() {
  // useless await here
  return await myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();


正确的

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later

// Also point that we don't use async keyword on the function because
// we can simply returns the promise returned by myfunction
function start() {
  return myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();


另外,要知道有一种特殊情况return await是正确且重要的:(使用 try/catch)

“返回等待”是否存在性能问题?

考虑到 Node 是单线程的。它不是减少了每分钟的请求,也增加了完成请求之间的延迟。
2021-03-11 14:20:20
值得一提的是,在“CORRECT”示例中,没有必要声明startasync函数(尽管有些人无论如何都会选择这样做,以便更明确)
2021-03-14 14:20:20
@j.doe 我添加了一个片段
2021-03-28 14:20:20
但这不起作用,我更新了我的代码。我仍然遇到同样的错误
2021-04-02 14:20:20
谢谢,我找到了我的问题。我试图在回调中做它是 start() 函数。解决方案是: const start = async function(a, b) { task.get(options, async function (error, result1) { const result = await myfunction('test', 'test');
2021-04-07 14:20:20

要使用await,它的执行上下文需要async在本质上

正如它所说,在做任何事情之前,您需要先定义executing context您愿意执行await任务的性质

只需放在您的任务将执行asyncfn声明之前async

var start = async function(a, b) { 
  // Your async task will execute with await
  await foo()
  console.log('I will execute after foo get either resolved/rejected')
}

解释:

在你的问题,你导入的是method这是asynchronous在本质上,将并行执行。但是,您尝试执行该async方法的位置位于execution context您需要定义async以使用的不同方法中await

 var helper = require('./helper.js');   
 var start = async function(a,b){
     ....
     const result = await helper.myfunction('test','test');
 }
 exports.start = start;

想知道引擎盖下发生了什么

await消耗Promise/未来/任务返回方法/函数并将方法/函数async标记为能够使用等待。

此外,如果您熟悉promises,await实际上正在执行相同的Promise/解决过程。创建一个Promise链并在resolve回调中执行你的下一个任务

有关更多信息,您可以参考MDN 文档

这是一个正确的答案,实际上解释了下划线的原因。投票了。
2021-03-15 14:20:20
即使在启动函数中使用异步,我也会收到错误
2021-03-24 14:20:20
我不确定您在哪里丢失并收到此错误,没有如此复杂的解释来解决此错误。
2021-04-03 14:20:20

当我收到此错误时,结果证明我在“async”函数中调用了 map 函数,因此此错误消息实际上是指未将 map 函数标记为“async”。我通过从 map 函数中取出“await”调用并提出其他一些获得预期行为的方法来解决这个问题。

var myfunction = async function(x,y) {
    ....
    someArray.map(someVariable => { // <- This was the function giving the error
        return await someFunction(someVariable);
    });
}
这对我来说是个问题。我用 for 循环替换了 map 函数,这对我来说是一个简单的解决方案。但是,根据您的代码,此解决方案可能对您不起作用。
2021-03-14 14:20:20
仅供参考,您也可以这样做 someArray.map(async (someVariable) => { return await someFunction(someVariable)})
2021-03-22 14:20:20
await你的代码是误导,因为Array.map不会处理功能作为一个异步函数。完全清楚,map功能完成后,someFunction将全部挂起。如果您想真正等待函数完成,则必须编写 :await Promise.all(someArray.map(someVariable => someFunction(someVariable)))await Promise.all(someArray.map(someFunction))).
2021-04-08 14:20:20

我遇到了同样的问题,以下代码块给出了相同的错误消息:

repositories.forEach( repo => {
        const commits = await getCommits(repo);
        displayCommit(commits);
});

问题是 getCommits() 方法是异步的,但我将参数 repo 传递给它,它也是由 Promise 生成的。所以,我不得不像这样添加 async 这个词:async(repo) 然后它开始工作:

repositories.forEach( async(repo) => {
        const commits = await getCommits(repo);
        displayCommit(commits);
});
非常感谢!两个小时后我读了这个答案 XD
2021-03-29 14:20:20

如果您正在编写 Chrome 扩展程序,并且在根目录下的代码出现此错误,您可以使用以下“解决方法”修复它:

async function run() {
    // Your async code here
    const beers = await fetch("https://api.punkapi.com/v2/beers");
}

run();

基本上,您必须将异步代码包装在一个中async function,然后在不等待的情况下调用该函数。

你知道为什么在 chrome 中会发生这种情况吗?
2021-03-13 14:20:20