我在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 is only valid in async function

问题是什么?


当前回答

这在一个文件工作..

看起来await only应用于本地函数,必须是异步的。

我现在也在与更复杂的结构作斗争,在不同的文件之间。这就是我编写这个小测试代码的原因。

编辑:我忘了说我正在使用node.js…sry基因。我没有一个明确的问题。只是觉得这对讨论有帮助。

    function helper(callback){



    function doA(){

        var array = ["a ","b ","c "];

        var alphabet = "";

        return new Promise(function (resolve, reject) {

            array.forEach(function(key,index){

            alphabet += key;

                if (index == array.length - 1){

                    resolve(alphabet);

                };

            });

        });

    };



    function doB(){

        var a = "well done!";

        return a;

    };



    async function make() {

        var alphabet = await doA();
        var appreciate = doB();

        callback(alphabet+appreciate);

    };

    make();

};

helper(function(message){

    console.log(message);

});

其他回答

要使用await,其执行上下文本质上需要是异步的

如上所述,您需要定义执行上下文的性质,在此上下文中,您愿意在任何事情之前等待一个任务。

只要把async放在你的异步任务将要执行的fn声明之前。

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')
}

解释:

在您的问题中,您正在导入一个本质上是异步的并将并行执行的方法。但是当你试图执行异步方法时,你需要在一个不同的执行上下文中定义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/future / task-return方法/函数,async将一个方法/函数标记为能够使用Await。

另外,如果你熟悉承诺,等待实际上是在做同样的承诺/解决过程。创建承诺链,并在resolve回调中执行您的下一个任务。

更多信息请参考MDN DOCS。

Express的一个常见问题:

警告可以指向函数,也可以指向调用它的位置。

快递项目通常是这样的:

app.post('/foo', ensureLoggedIn("/join"), (req, res) => {
    const facts = await db.lookup(something)
    res.redirect('/')
})

注意该函数的=>箭头函数语法。

问题并不在数据库中。查找调用,但就在Express项中。

需要:

app.post('/foo', ensureLoggedIn("/join"), async function (req, res) {
    const facts = await db.lookup(something)
    res.redirect('/')
})

基本上,删除=>并添加async函数。

async / await的当前实现只支持async函数内部的await关键字。

 var start = async function(a, b) {

 }

对于那些感兴趣的人,顶层等待的提议目前处于阶段2:https://github.com/tc39/proposal-top-level-await

在这篇不错的文章中找到下面的代码:使用Axios的Node中的HTTP请求

const axios = require('axios')

const getBreeds = async () => {
  try {
    return await axios.get('https://dog.ceo/api/breeds/list/all')
  } catch (error) {
    console.error(error)
  }
}

const countBreeds = async () => {
  const breeds = await getBreeds()

  if (breeds.data.message) {
    console.log(`Got ${Object.entries(breeds.data.message).length} breeds`)
  }
}

countBreeds()

或者用Promise:

const axios = require('axios')

const getBreeds = () => {
  try {
    return axios.get('https://dog.ceo/api/breeds/list/all')
  } catch (error) {
    console.error(error)
  }
}

const countBreeds = async () => {
  const breeds = getBreeds()
    .then(response => {
      if (response.data.message) {
        console.log(
          `Got ${Object.entries(response.data.message).length} breeds`
        )
      }
    })
    .catch(error => {
      console.log(error)
    })
}

countBreeds()

我也遇到了同样的问题,下面的代码块给出了同样的错误信息:

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

问题是方法getCommits()是异步的,但我传递给它的参数repo也是由承诺产生的。所以,我必须像这样添加单词async: async(repo),它开始工作:

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