在Node.js中,异步或步骤是什么意思?

7

我无法让我的异步代码在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');
  }
]);
2个回答

3
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 捕获所有抛出的错误并使用回调函数处理它们;这会改变应用程序的行为,而这些库只应该清理代码的外观。 - Async 有更好的组合选项,并且看起来更加简洁。

doSomething() 是每个函数中的回调函数,即 f1 和 f2 吗? - NikG
我想我对回调函数的理解还不够透彻;我试图获取从数据库中检索结果的两个单独函数,并将它们存储到一个数组中,然后再使用第二个函数处理该数组。我认为按顺序执行它们是正确的方式(或者嵌套),但不确定回调函数的结构应该是什么样的。对此我感到很抱歉,表述可能不够清晰 :( - NikG
回调函数 "callback(null, {a : '5'});" 具体做什么? - NikG
使用node.js时,每个回调函数都应该有两个参数:第一个是错误,第二个是传递回来的数据。因此,“callback(null, {a: '5'});”基本上是在说没有错误,并且你正在返回数据 - {a: '5'}。我将进一步完善这些示例。 - Oved D

2

我只会讲 async,但如果要使用它,你需要在传递给 async.series 的数组中的匿名函数中调用传递到这些函数中的 callback 参数,以表示该函数已完成处理。就像这样:

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

我测试了一下,当然它起作用了。我猜回调是必需的。但是,当除了按顺序执行代码之外没有什么可做的时候,回调的意义是什么呢? - NikG
1
因为通常你的 async.series 函数具有异步方面,只有在完成(可能比函数本身返回的时间长)后才会调用回调函数。 - JohnnyHK
1
它将被传递到您作为async.series的第二个参数提供的顶级回调中。请参阅文档 - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接