【问题标题】:async OR step in Node.jsNode.js 中的异步或步骤
【发布时间】:2014-03-12 21:43:59
【问题描述】:

我无法让我的异步代码与 node.js 一起工作

同时尝试 async 和 step 库——代码只返回第一个函数(似乎没有完成其余的函数)。我做错了什么?

谢谢!

var step = require('step');
step(
function f1(){
        console.log('test1');
},
function f2(){
        console.log('test2');
},
function finalize(err) {
    if (err) { console.log(err);return;}
    console.log('done with no problem');
  }
);

或者这个:

var async = require('async');
async.series([
function f1(){
        console.log('test1');
},
function f2(){
        console.log('test2');
},
function finalize(err) {
    if (err) { console.log(err);return;}
    console.log('done with no problem');
  }
]);

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    Step.js 期望每个步骤都有回调。使用 Step 的函数也应该回调结果而不是返回它。

    假设你有:

    function pullData(id, callback){
      dataSource.retrieve(id, function(err, data){
        if(err) callback(err);
        else callback(data);
      });
    }
    

    使用 Step 的工作方式如下:

    var step = require('step');
    
    function getDataFromTwoSources(callback){
      var data1,
        data2;
      step(
        function pullData1(){
          console.log('test1');
          pullData(1, this);
        },
        function pullData2(err, data){
          if(err) throw err;
          data1 = data;
          console.log('test2');
          pullData(2, this);
        },
        function finalize(err, data) {
          if(err)
            callback(err);
          else {
            data2 = data;
            var finalList = [data1, data2];
            console.log('done with no problem');
            callback(null, finalList);
          }
        }
      );
    };
    

    这将使它继续执行这些步骤。

    请注意,我个人更喜欢异步有两个原因:

    • Step 捕获所有抛出的错误并对其进行回调;这会改变应用程序的行为,而这些库应该只是清理代码的外观。
    • 异步有更好的组合选项,看起来更干净

    【讨论】:

    • 是doSomething()每个函数中的回调函数,即f1和f2?
    • 我想我不太了解回调;试图获得 2 个单独的函数,将结果从 db 检索到数组中,然后是处理数组的第二个函数。我认为让它们按顺序排列是正确的方法(或嵌套),但不确定回调结构应该是什么。抱歉,对此没有更清楚:(
    • 什么是“回调(null,{a:'5'});”具体做什么?
    • 对于node.js,每个回调都应该有两个参数:第一个是错误,第二个是传回的数据。所以“回调(null,{a:'5'});”本质上是说没有错误,并且您正在返回数据-{a:'5'}。我将更多地清理示例。
    【解决方案2】:

    我只能与async 交谈,但为此,您传递给async.series 的数组中的匿名函数必须调用callback 参数,该参数在函数完成处理时传递给这些函数。如:

    async.series([
        function(callback){
            console.log('test1');
            callback();
        },
        function(callback){
            console.log('test2');
            callback();
        }
    ]);
    

    【讨论】:

    • 我对此进行了测试,当然它有效。我想回调是必需的。尽管除了串行执行代码之外没有什么真正可做的事情时,回调的意义何在?
    • 因为您的 async.series 函数通常具有异步方面,并且您只会在完成时调用回调(可能在函数本身返回很久之后)。
    • 它被传递到您作为第二个参数提供给async.series 的顶级回调中。请参阅docs
    猜你喜欢
    • 2014-12-05
    • 2013-05-11
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2015-05-16
    • 2014-07-04
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多