JavaScript设计模式——处理不需要的异步
我对基于事件的编程(使用node.js)相当陌生。我相信有些事情我不是在摸索,因为我一次又一次地遇到一个特别的问题 简言之,这个问题是在异步性似乎妨碍您的时候处理它。在我的例子中,这通常在使用第三方库时表现出来,第三方库的设计是无阻塞的,并且促进了基于回调的API 例如:现在我正在写一些大量使用的东西。我的程序正在抓取RSS提要并将结果塞进redis。我正在使用我认为与redis相同的策略:JavaScript设计模式——处理不需要的异步,javascript,asynchronous,node.js,redis,Javascript,Asynchronous,Node.js,Redis,我对基于事件的编程(使用node.js)相当陌生。我相信有些事情我不是在摸索,因为我一次又一次地遇到一个特别的问题 简言之,这个问题是在异步性似乎妨碍您的时候处理它。在我的例子中,这通常在使用第三方库时表现出来,第三方库的设计是无阻塞的,并且促进了基于回调的API 例如:现在我正在写一些大量使用的东西。我的程序正在抓取RSS提要并将结果塞进redis。我正在使用我认为与redis相同的策略: 刮取提要,将结果存储为redis散列,其键类似于feed::results: 将对最新结果的引用存储在f
feed::results:
feed::latest
下return latest_reading
放在get_latest_results
函数底部失败,因为直到函数准备退出后才定义最新的_reading。将return latest\u reading
放入hgetall
调用失败,因为return
引用回调,并且被get\u latest\u results
忽略
这只是一个例子,说明我似乎一直在写我的方式进入的那种情况。也许我是想把方形的钉子敲入圆孔,因为我不知道还有什么更好的。似乎应该有一种非黑客的方法来解决这类问题。您正在努力解决异步问题,因为您仍然在以同步范式编写函数 在异步中,您应该将回调附加到事件。您不应该期望来自异步函数(如
get\u latest\u results()
)的结果,但应该将回调函数作为参数传递给它,以便在结果就绪时调用。回调将对您的结果执行任何需要执行的操作:
var get_latest_results = function (feedId, readyCallback) {
client.get('feed:' + feedId + ':latest', function (err, res) {
var latest_reading_key = res.toString();
client.hgetall(latest_reading_key, function (err, res) {
readyCallback(res); //--- Trigger Callback
});
});
// how do I specify a return value for this function? //--- You don't
}
然后您可以这样调用您的函数:
get_latest_results(1000, function (result) {
//--- Do whatever needs to be done with the latest result...
});
+1.学会喜欢它因为JavaScript没有提供同步运行异步代码所需的语言级原语,如线程或协同程序(反之亦然)。
get_latest_results(1000, function (result) {
//--- Do whatever needs to be done with the latest result...
});