0

我对如何正确使用该async模块感到有些困惑。说我有:

result = long_sync_io_function();
short_sync_function(result);
... //other stuff dependent on result

通常,在 Node 中,您转换long_sync_io_function()为其异步对应物long_async_io_function(callback(err, result))并执行以下操作:

long_async_io_function(function(err, result) {
    if (!err) {
         short_sync_function(result);
         ...//other stuff dependent on result
    }
});

但是回调的不断嵌入很快就意味着大量的缩进。是正确的使用方法async

//1
async.waterfall([
    function(callback) {
        result = long_sync_io_function();
        callback(null, result);
    },
    function(result, callback) {
        short_sync_function(result);
        //other stuff dependent on result
    }
]);

或者

//2
async.waterfall([
    function(callback) {
        long_async_io_function(callback);
    },
    function(result, callback) {
        short_sync_function(result);
        ...//other stuff dependent on result
    }
]);

这些是等价的吗?我不知道是否aysnc有助于像 1 中那样创建异步代码,或者只是像 2 中那样有助于构建现有的异步代码。

4

1 回答 1

2

异步库无法创建异步函数/代码。相反,它是作为已经异步的代码的更高阶结构/组织的助手。

所以是2号。


附加答案

为了简单地避免嵌套回调,您不需要使用异步库。只需命名您的函数,而不是内联声明它们。所以,而不是:

long_async_io_function(function(err, result) {
    if (!err) {
         //..do stuff dependent on result
         another_async_function(function(err,result) {
            //..do other stuff
         });
    }
});

你可以这样写:

function do_other_stuff (err, result) {
    //..
}

function do_stuff_with_io_result (err, result) {
    //..
    another_async_function(do_other_stuff);
}

long_async_io_function(do_stuff_with_io_result );

这使得代码自我记录并且更容易调试(特别是如果您在调试器中单步执行或查看堆栈跟踪),因此您可以删除多余的注释,如do stuff with resultand do other stuff

于 2013-08-13T18:03:57.327 回答