JavaScriptdevise模式 – 处理不需要的asynchronous
我很新的基于事件的编程(使用node.js)。 我相信有一点我不太在意,因为我遇到了一个又一个问题。
总之,这个问题在处理asynchronous性问题的时候似乎正在妨碍你。 在我的情况下,最常见的情况是使用第三方库,这些库在devise时没有阻塞,并且推广了基于callback的API。
例如:现在我正在写一些大量使用mranney的node-redis库的东西 。 我的程序正在抓取RSS源并将结果放入redis。 我正在使用我认为是redis常见的策略:
- 抓取feed,将结果存储为一个redis hash,其中包含一个类似
feed:<feedId>:results:<timestamp>
的键feed:<feedId>:results:<timestamp>
。 - 在
feed:<feedId>:latest
存储对最新结果的引用feed:<feedId>:latest
。
var redis = require(“redis”); var client = redis.createClient(); var get_latest_results = function(feedId){ client.get('feed:+ feedId +':latest',function(err,res){ var latest_reading_key = res.toString(); client.hgetall(latest_reading_key,function(err,res){ var latest_reading = res; }); }); //如何为这个函数指定一个返回值? }
在get_latest_results
函数的底部放置return latest_reading
失败,因为在函数准备好退出之前,不会定义latest_reading。 在hgetall
调用中放置return latest_reading
失败,因为return
指向callback,并被get_latest_results
忽略。
这只是我似乎不断写入自己的方式的一个例子。 也许我正在试图把这个方块塞进圆孔里,因为我不知道更好。 这似乎应该有一个解决这类问题的不速之客的方法。
你正在努力与asynchronous,因为你仍然在同步范例中编写你的函数。
在asynchronous你应该附加callback事件。 你不应该期待像get_latest_results()
这样的asynchronous函数的结果,但是当结果准备就绪时,你应该把一个callback函数作为parameter passing给它。 callback将做你的结果需要做的一切:
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... });