我应该怎么做节点? 快速的path和慢的path

我有一些通过快速path获取数据的代码,如果快速path不可用,我想实现回退到慢速path。 这里还是很新的node.js,所以我不知道如何去做这件事。

这里是我的意思的一个简单的例子:

function getThing(callback) { var thang = getThingTheFastWay(); if (!thang) { thang = getThingTheSlowWay(); } if (!thang || !thang.validate()) { return callback(new Error('invalid thang')); } callback(null, thang); } 

所以我的目标是在getThingTheSlowWay()asynchronous执行I / O getThingTheSlowWay() 。 这个方法的后半部分需要被提供给getThingTheSlowWay()的callback吗?

       

网上收集的解决方案 "我应该怎么做节点? 快速的path和慢的path"

这个方法的后半部分需要被提供给getThingTheSlowWay()的callback吗?

对,就是这样。 你不能做thang =asynchronous结果。 你的function基本上是这样的:

 function getThing(callback) { var thang = getThingTheFastWay(); if (thang) { if (!thang.validate()) callback(new Error('invalid thang')); else callback(null, thang); } else { getThingTheSlowWay(function(err, thang) { if (!err && !thang.validate()) callback(new Error('invalid thang')); else callback(err, thang); }); } } 

为了避免这种重复,你可以使用命名函数:

 function getThing(callback) { function validateThang(err, thang) { if (!err && !thang.validate()) callback(new Error('invalid thang')); else callback(err, thang); } var thang = getThingTheFastWay(); if (thang) validateThang(null, thang); else getThingTheSlowWay(validateThang); } 

另一种方法是使用承诺。 假设getThingTheSlowWay返回一个承诺,而getThingTheFastWay不,它会看起来像

 function getThing() { return Promise.resolve(getThingTheFastWay() || getThingTheSlowWay()) .then(function validateThang(thang) { if (thang.validate()) return thang; else throw new Error('invalid thang'); }); } 

我build议你总是使用callback,不pipe是否“快”或不。 只是因为你认为速度很快,并不意味着它会一直存在 – 而且在高性能的服务器领域,为什么写一些可能会阻塞的东西呢?

 function getThing(callback) { var thang = getThingTheFastWay(function(err, thang) { if (thang && !err) { callback(err, thang); } else { getThingTheSlowWay(function(err, thang) { callback(err, thang); }); } }); } 

这当然需要重写下游函数以支持callback,但是值得一做。 即使你使用第三方函数来做这件事,围绕一个长时间运行的函数来包装自己的callback也是非常简单的。

考虑使用承诺。 https://www.promisejs.org/一个承诺允许你执行一些行动,当完成执行callback。 如果快速操作失败,则可以用慢动作恢复。 所有这些行为都可以与承诺一起工作。

有一点需要考虑的是,考虑到快速操作通常阻塞,慢操作可能不会很慢。 遇到很多请求时可能会有问题。

如果您不想使用承诺,请检查快速版本是否正常工作,并立即执行callback并返回。 如果它没有返回,则可能需要将callback传递给获取慢方法函数,因为那样会有asynchronous调用,该callback将具有callback来调用callback参数

承诺在这里可能是有用的:

 function getThing() { return new Promise(function(resolve, reject) { getThingTheFastWay().then(function(result) { resolve(result); }).catch(function() { getThingTheSlowWay().then(function(result) { resolve(result); }).catch(function() { reject(); }); }); }); } 

使用这将是:

 getThing().then(function(result) { // do something with the result }); 

您可以使用和声标志启用承诺,或者使用蓝鸟等库(推荐)