JavaScriptdevise模式 – 处理不需要的asynchronous

我很新的基于事件的编程(使用node.js)。 我相信有一点我不太在意,因为我遇到了一个又一个问题。

总之,这个问题在处理asynchronous性问题的时候似乎正在妨碍你。 在我的情况下,最常见的情况是使用第三方库,这些库在devise时没有阻塞,并且推广了基于callback的API。

例如:现在我正在写一些大量使用mranney的node-redis库的东西 。 我的程序正在抓取RSS源并将结果放入redis。 我正在使用我认为是re​​dis常见的策略:

  1. 抓取feed,将结果存储为一个redis hash,其中包含一个类似feed:<feedId>:results:<timestamp>的键feed:<feedId>:results:<timestamp>
  2. 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... });