Javascript 在node.js中执行一系列异步操作

Javascript 在node.js中执行一系列异步操作,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,在Node.js中执行一系列异步操作的好方法是什么?这是针对脚本类型的应用程序,一个应该从命令行运行然后完成作业的应用程序,它不在服务器的上下文中,服务器应该位于后台并同时处理多个不同的事情 我知道Promises/A+aka Thenables,但是语法没有那么好: do_some_stuff().then( function() { do_some_other_stuff().then( function() { do_

在Node.js中执行一系列异步操作的好方法是什么?这是针对脚本类型的应用程序,一个应该从命令行运行然后完成作业的应用程序,它不在服务器的上下文中,服务器应该位于后台并同时处理多个不同的事情

我知道Promises/A+aka Thenables,但是语法没有那么好:

do_some_stuff().then(
   function() {
       do_some_other_stuff().then(
           function() {
               do_the_last_stuff().then(
                   function() {
                      // we are done with everything!
                   }
               )
           }
       )
   }
);
当我们有更多的操作时,缩进会使它看起来很难看

我喜欢jasmine的做法,异步操作将传递一个函数,该函数应该在完成时调用。基于这个想法,我创建了一个我称之为AsyncSequence的东西。AsyncSequence运行一系列操作,每个操作都传递一个
done
函数,该函数应在完成时调用。使用AsyncSequence时,上面的情况如下所示:

AsyncSequence.run(
    function(done) {
        do_some_stuff().then(done);
    },
    function(done) {
        do_some_other_stuff().then(done);
    },
    function(done) {
        do_the_last_stuff().then(done);
    },
    function() {
        // we are done with everything!
    }
);

我认为这样做很有效,而且看起来更好,但我想知道是否有一种更“标准”的方法?当您经验丰富的Node.js程序员看到这一点时,是否会想到与我的AsyncSequence类似的东西?或者不完全相似但可用于相同目的的东西?

使用承诺/A+,
然后可以链接起来,这是您的第一个示例:

do_some_stuff()
.then(do_some_other_stuff)
.then(do_the_last_stuff)
.then(function() {
  // we are done with everything!
});
将承诺视为未来价值的容器,
然后
将未来价值转换为另一个价值(类似于
[].map
)。但是,如果传递给
的函数返回另一个承诺,那么它将被取消包装。举一个更具体的例子:

getPostData(req).then(function(data) {
  return createNewUser(data);
}).then(function(user) {
  return JSON.stringify(user);
}).then(function(json) {
  return successResponse(json);
}).then(function(body) {
  res.end(body);
});

本例使用显式函数参数使流更加明显
createNewUser
返回表示保存到数据库中的用户对象的承诺,而
JSON.stringify
当然只返回字符串。承诺/A+可以处理和链接这两种返回值。

使用异步模块。参见watefall方法


您所写的内容似乎与“是”非常相似,但不幸的是,回调与承诺不起作用。我做不到:async.瀑布([function(cb){some_op.then(cb)}]);因为回调在成功时希望null作为第一个参数。如果你想坚持承诺,你应该像Matt sugguested那样使用承诺链。不过,您应该确定使用承诺,因为节点生态系统是围绕回调构建的。但如果操作本身是异步的呢?假设createNewUser必须调用一个外部服务,那么它将如何工作?@MikaelLindqvist这就是承诺的全部要点,与“异步”函数一起使用。下一个
。然后
将等待用户被创建。创建新用户也应返回一个承诺。这反过来又会被锁住是的,这就是我需要的。我对承诺的理解是不正确的。
async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
      // arg1 now equals 'one' and arg2     now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});