Javascript - 等待具有新异步函数的异步函数

时间:2015-12-01 09:54:06

标签: javascript asynchronous async-await ecmascript-next

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

详细说明:
在查找代码或运行特定函数或代码块之前,我已经查找了一些等待异步函数完成的方法。但有一件事已经让我困扰了很长时间 - 我不知道是否还在等待新的异步函数,或者是否需要考虑他们自己的代码。

伪代码:

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函数??

3 个答案:

答案 0 :(得分:1)

不,调用时不等待async个函数。他们只返回promise

async函数中 - 这是他们的优势 - 您可以明确await个承诺,包括从其他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(…);
    }
}())

答案 1 :(得分:1)

使用此git js ASync

  

如何使用

     

Async提供了大约20个函数,包括通常的“功能”嫌疑(map,reduce,filter,each ......)以及异步控制流的一些常见模式(parallel,series,waterfall ...)。所有这些函数都假设您遵循Node.js惯例,即提供单个回调作为异步函数的最后一个参数。

     

快速示例

async.map(['file1','file2','file3'], fs.stat, function(err, results){
    // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], fs.exists, function(results){
    // results now equals an array of the existing files
});

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

还有更多可用功能,因此请查看下面的文档以获取完整列表。这个模块旨在全面,所以如果你觉得有任何遗漏,请为它创建一个GitHub问题。

Read More

答案 2 :(得分:0)

除以上示例外,请查看以下代码示例。异步和等待的概念会更清楚。

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();