Javascript-使用新异步函数等待异步函数

Javascript-使用新异步函数等待异步函数,javascript,asynchronous,async-await,ecmascript-next,Javascript,Asynchronous,Async Await,Ecmascript Next,问题: 是否可以等待启动新异步函数的异步函数? 详细信息: 在继续编写代码或运行特定的函数或代码块之前,我已经找到了一些等待异步函数完成的方法。但有一件事困扰了我很长一段时间——我不知道启动的新异步函数是否也在等待,或者它们是否需要考虑自己的代码。 伪代码: var value = 1; af1(); alert(value); async function af1(){ af2(); } async function af2(){ af3(); } async f

问题:
是否可以等待启动新异步函数的异步函数?

详细信息:
在继续编写代码或运行特定的函数或代码块之前,我已经找到了一些等待异步函数完成的方法。但有一件事困扰了我很长一段时间——我不知道启动的新异步函数是否也在等待,或者它们是否需要考虑自己的代码。

伪代码:

var value = 1;
af1();
alert(value);

async function af1(){
    af2();
}

async function af2(){
    af3();
}

async function af3(){
    value = 2;
}
我不知道这是不是一个很好的例子(或者甚至是正确的语法),但是把异步函数想象成一些需要一些时间才能完成的ajax请求。我有一种感觉,如果在af1上添加延迟的jQuery,它将只等待af1,而忽略af2和af3。我还为一些函数使用了一个外部javascript文件,我无法真正控制在其中启动哪些新函数


那么,是否可以将所有这些都打包成一些东西,并在完成之后运行一些代码呢?或者我对jQuery的延迟和.done函数的理解有误吗???

否,
异步
函数在调用时不等待。他们只是回了一封信

async
函数内部-这是它们的优势-您可以明确地
等待
承诺,包括从其他
async
函数返回的承诺

您的代码应该使用返回值编写,如下所示:

(async function() { // neccessary to use await
    value = await af1();
    alert(value);
}());
af1().then(alert); // or just using promise syntax

async function af1(){
    return af2();
}
async function af2(){
    return af3();
}
async function af3(){
    return 2; // or maybe rather something like
    return $.ajax(…);
}
但您不需要返回值,也可以使用
await
作为结束方法:

(async function() {
    var value = 1;
    await af1();
//  ^^^^^
    alert(value);

    async function af1(){
        await af2();
    }
    async function af2(){
        await af3();
    }
    async function af3(){
        value = 2; // or maybe rather something like
        value = await $.ajax(…);
    }
}())
使用这个GitJS

如何使用 Async提供了大约20个函数,其中包括常见的“功能性”可疑对象(映射、减少、过滤,每个…)以及异步控制流的一些常见模式(并行、串行、瀑布…)。所有这些函数都假定您遵循Node.js约定,提供单个回调作为异步函数的最后一个参数

快速示例 还有更多可用的功能,请查看下面的文档以获取完整列表。本模块旨在全面,因此如果您觉得缺少任何内容,请为其创建GitHub问题


除了上面的示例,请看下面的代码示例。异步和等待的概念将更加清晰

async function doWork(){
    try {
        const response = await makeRequest('facebook'); //using await will wait until the response returned from the makeRequest function
        //console.log('Response Received' + response );

        const response2 = await makeRequest('google');
        //console.log('Response2 Received' + response2 );
    } catch(err) {
        alert(err);
    }
}

function makeRequest(str){
    //function body that takes time to process, eg: server call
    return "making request to " + str;
}

doWork();

你真的应该阅读关于承诺的内容。你应该勾选“它将[…]忽略af2和af3”-是的,当然,因为你甚至没有给他们打电话。您能添加一些调用使示例更真实一些吗?@mathkid91:谢谢,我修改了我的答案,现在它更有意义了:-)返回
承诺的函数是我将调用的异步函数,但并非所有异步函数都返回
承诺。可以是基于回调的、基于CSP的,等等。@BjörnRoberg:OP正在谈论新的ES7建议的
异步函数
s,它可以。我突出显示了关键字,以表明我不是指一般意义上的异步函数。很高兴得到确认,我必须处理每个函数。我想我得在我正在使用的图书馆里挖一些。谢谢你的回答@mathkid91:如果您使用的库不支持承诺(或者至少是一个+兼容的thenables,像jQuery一样),请看一看。否则,传输的
async wait
应该是开箱即用的。感谢您的回答:)因为这也在注释中提到过,我将查找这是什么。如何将数据从async.parallel传递到async.瀑布
async function doWork(){
    try {
        const response = await makeRequest('facebook'); //using await will wait until the response returned from the makeRequest function
        //console.log('Response Received' + response );

        const response2 = await makeRequest('google');
        //console.log('Response2 Received' + response2 );
    } catch(err) {
        alert(err);
    }
}

function makeRequest(str){
    //function body that takes time to process, eg: server call
    return "making request to " + str;
}

doWork();