0

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

详细信息:
我已经查找了很多方法来等待异步函数完成,然后再继续执行代码,或者运行特定的函数或代码块。但是有一件事困扰了我很长时间 - 我不知道是否也在等待新的异步函数启动,或者是否需要考虑他们自己的代码。

伪代码:

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

async function af1(){
    af2();
}

async function af2(){
    af3();
}

async function af3(){
    value = 2;
}

我不知道这是否是一个很好的例子(甚至是正确的语法),但将异步函数想象成一些需要一些时间才能完成的 ajax 请求。我有一种感觉,如果你在 af1 上添加一个 jQuery deferred,它只会等待 af1 而忽略 af2 和 af3。我还为某些功能使用了外部 javascript 文件,但我并不能真正控制在那里启动哪些新功能。

再说一遍,是否有可能将所有这些包装成一些东西并在完成后运行一些代码?还是我对 jQuery 的 deferred 和 .done 函数有误解?

4

3 回答 3

1

使用这个 git js ASync

如何使用

Async 提供了大约 20 个函数,包括通常的“功能性”嫌疑人(map、reduce、filter、each…)以及一些常见的异步控制流模式(parallel、series、falling…)。所有这些函数都假定您遵循 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 问题。

阅读更多

于 2015-12-01T10:00:22.817 回答
1

不,async调用时不等待函数。他们只是回报了一个承诺

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(…);
    }
}())
于 2015-12-01T09:59:54.770 回答
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();
于 2020-01-15T15:01:29.177 回答