调用多个函数nodejs

时间:2017-06-08 17:02:28

标签: javascript node.js

我刚开始使用nodejs,我基本上有两个我想要执行的函数,并且基于每个函数的成功或者这些函数的错误,我希望包装器函数生成一个整体状态代码。我查看了异步软件包,我让它在快乐的路径中工作,一切都成功,我的上一次回调获得成功。但如果一个人失败怎么办?我看到错误被发送到async.waterfall的最后一个回调,但第二个函数永远不会运行,因为有一个错误,我想知道两个函数的结果。我尝试过,系列游戏,并行游戏和瀑布游戏,从我所知道的情况来看,一旦出现错误,他们都会调用最终的回调函数。在Node中有这样的惯用方法吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

Hello, this is the code: <a href='foo'>foo</a>

Bye

答案 1 :(得分:0)

其他答案可以正常使用,但我认为它们不是我做的方式。

鉴于您已经对AsyncJS感兴趣,我会考虑使用它,但不要直接传播错误。吞下错误并让回调的数据部分代表您要传达的状态,因为您的回调有效地处理它。

例如,假设您有一个异步系列或并行呼叫功能的部分:

...
function getModel((cb) => {
   model.find({_id: 1}, (err, data) => {
     if (err) return cb(null, { status: 500, message: 'Database connection error' });
     if (!data) return cb(null, { status: 404, message: 'model 1 not found' });
     return cb(null, { status: 200, model: data });
   });
}),
...

答案 2 :(得分:0)

给定一个通用的异步函数......

const double = (x, k) =>
  k (x * 2)

double (1, console.log)
// 1 * 2
// => 2

<强> compk

我们可以使用compk

组成两个异步函数

&#13;
&#13;
const double = (x, k) =>
  k (x * 2)

const compk = f => g =>
  (x, k) =>
    f (x, y => g (y, k))
  
compk (double) (double) (1, console.log)
// (1 * 2) * 2
// 2 * 2
// =>  4
&#13;
&#13;
&#13;

<强> composek

我们可以使用composek

组成N个异步函数

&#13;
&#13;
const double = (x, k) =>
  k (x * 2)

const compk = f => g =>
  (x, k) =>
    f (x, y => g (y, k))

const composek = (f, ...fs) =>
  (x, k) =>
    f === undefined
      ? k (x)
      : compk (composek (...fs)) (f) (x, k)

composek (double, double, double, double, double) (1, console.log)
// ((((1 * 2) * 2) * 2) * 2) * 2
// (((2 * 2) * 2) * 2) * 2
// ((4 * 2) * 2) * 2
// (8 * 2) * 2
// 16 * 2
// => 32
&#13;
&#13;
&#13;

节点式连续传递样式

Node.JS有一个约定,它使用错误优先连续传递样式。如果我们想要编写节点式cps函数并正确地冒泡错误,那么需要多加注意

&#13;
&#13;
const nodedouble = (x, k) =>
  x > 10
    ? k (Error('cannot double numbers over 10'))
    : k (null, x * 2)
    
const nodedebug = (err, x) => {
  if (err)
    console.error('Error', err.message)
  else
    console.log(x)
}

nodedouble (2, nodedebug)
// 2 * 2
// => 4

nodedouble (12, nodedebug)
// 12 * 2
// => Error: cannot double numbers over 10
&#13;
&#13;
&#13;

<强> nodecompk

我们可以使用nodecompk

组成两个节点式cps函数

&#13;
&#13;
const nodedouble = (x, k) =>
  x > 10
    ? k (Error('cannot double numbers over 10'))
    : k (null, x * 2)
    
const nodedebug = (err, x) => {
  if (err)
    console.error('Error', err.message)
  else
    console.log(x)
}

const nodecompk = f => g =>
  (x, k) =>
    f (x, (err, y) =>
      err ? k (err) : g (y, (err, z) =>
        err ? k (err) : k (null, z)))
  

nodecompk (nodedouble) (nodedouble) (1, nodedebug)
// (1 * 2) * 2
// 2 * 2
// => 4

nodecompk (nodedouble) (nodedouble) (6, nodedebug)
// (6 * 2) * 2 
// 12 * 2
// => Error: cannot double numbers over 10
&#13;
&#13;
&#13;

<强> nodecomposek

我们可以使用nodecomposek

组成N节点式cps函数

&#13;
&#13;
const nodedouble = (x, k) =>
  x > 10
    ? k (Error('cannot double numbers over 10'))
    : k (null, x * 2)
    
const nodedebug = (err, x) => {
  if (err)
    console.error('Error', err.message)
  else
    console.log(x)
}

const nodecompk = f => g =>
  (x, k) =>
    f (x, (err, y) =>
      err ? k (err) : g (y, (err, z) =>
        err ? k (err) : k (null, z)))
  
const nodecomposek = (f,...fs) =>
  (x, k) =>
    f === undefined
      ? k (null, x)
      : nodecompk (nodecomposek (...fs)) (f) (x, k)
      
nodecomposek (nodedouble, nodedouble, nodedouble) (2, nodedebug)
// ((2 * 2) * 2) * 2
// (4 * 2) * 2
// 8 * 2
// => 16

nodecomposek (nodedouble, nodedouble, nodedouble) (8, nodedebug)
// ((8 * 2) * 2) * 2
// (16 * 2) * 12
// => Error cannot double numbers over 10
&#13;
&#13;
&#13;