我刚开始使用nodejs,我基本上有两个我想要执行的函数,并且基于每个函数的成功或者这些函数的错误,我希望包装器函数生成一个整体状态代码。我查看了异步软件包,我让它在快乐的路径中工作,一切都成功,我的上一次回调获得成功。但如果一个人失败怎么办?我看到错误被发送到async.waterfall的最后一个回调,但第二个函数永远不会运行,因为有一个错误,我想知道两个函数的结果。我尝试过,系列游戏,并行游戏和瀑布游戏,从我所知道的情况来看,一旦出现错误,他们都会调用最终的回调函数。在Node中有这样的惯用方法吗?
答案 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
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;
<强> composek 强>
我们可以使用composek
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;
节点式连续传递样式
Node.JS有一个约定,它使用错误优先连续传递样式。如果我们想要编写节点式cps函数并正确地冒泡错误,那么需要多加注意
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;
<强> nodecompk 强>
我们可以使用nodecompk
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;
<强> nodecomposek 强>
我们可以使用nodecomposek
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;