【发布时间】:2014-04-18 00:12:57
【问题描述】:
在“不..我不想这样做..”很久之后,我终于需要使用 async.js 库了。
我没有胶水怎么用它会让我开心...
让我们考虑这个非常简化的伪函数:
说真的..我什至不知道如何开始..任何帮助都是很好的帮助。^^
getOPGdata( socket, [ 'url1', 'url2', 'url3', 'url3' ], 'requestid-5364356' );
function getOPGdata( socket, urls, id ){
var results = {};
results[id] = [];
urls.forEach( function( url ) {
url = trim( url );
redis.hgetall( 'ogp:'+url, function ( err, reply ) {
if( reply ) {
results[id].push( reply );
}
else {
results[id].push( refreshOPGcache( url ) );
}
});
});
socket.emit('ogp', results );
}
refreshOPGcache( url ){
redis.hgetall( 'cache:'+url, function ( err, reply ) {
return reply;
}
}
编辑:
这是正确的做法吗?
function getOPGdata( socket, urls, id ){
var results = {};
results[id] = [];
async.map( urls, getOGPfromCache, function(err, r){
results[id] = r;
console.log( results );
});
}
function getOGPfromCache( url, callback ){
redis.hgetall( 'ogp:'+url, function ( err, reply ) {
if( err ){ callback( null, false ); }
if( reply ) {
callback( null, reply );
}
else {
getFreshOPGdata( url, callback );
}
});
}
function getFreshOPGdata( url, callback ){
redis.hgetall( 'justademo:'+url, function ( err, reply ) {
if( err ){ callback( null, false ); }
if( reply ) {
callback( null, reply );
}
else {
callback( null, false );
}
});
}
【问题讨论】:
-
你需要了解 javascript 闭包。 See this answer 获得比我目前愿意写出的更全面的答案。一旦你掌握了这一点,异步的东西就相当简单了。
标签: node.js asynchronous redis async.js