正确的方法从JavaScriptcallback中获取数据

我将api服务器从一个普通的nodejs脚本转换为一个使用express框架的更好的稳定性。

我的问题之一是,你不能从callback中返回值,因为原来的代码已经继续…

var _json = api.query(); 

不知何故,我们更喜欢.query()返回最终的结果对象,所以我们可以将其string化为JSON,然后将其传递给像这样的渲染:

 // Render the display res.render('posts-resp', { title: res.app.settings.app_title, _use_Callback: _use_Callback, json: _json }); 

但是,db查询使用callback来处理查询结果,所以不可能像这样返回一个值。 在原始版本中, 数据库脚本处理渲染最终的视图,但我不希望他们像这样绑在一起。

 query: function(){ db.query( this._buildQuery(), function(err, res){ if(err){ throw err; } res.fetchAll(function(err, rows){ if(err){ throw err; } db.query('SELECT FOUND_ROWS() as num, UNIX_TIMESTAMP() as query_timestamp;', function(err, cnt_res){ if(err){ throw err; } cnt_res.fetchAll(function(err, cnt_rows){ var obj = { results:rows, total_results:cnt_rows[0].num, current_offset:self.offset, query_timestamp:cnt_rows[0].query_timestamp }; // ... ? }); }); }); }); } 

我怎样才能正确地获取数据并将其传递给渲染系统?

JavaScript是一个非常灵活的语言。 您并不需要直接将您的视图绑定到数据库代码,因为您可以使用函数作为包装来将视图代码抽象出来,并将其与数据库逻辑分开。

当需要asynchronous逻辑时,callback可以是一个非常强大的工具。 我不确定这是否需要,但是仍然可以使用包装器函数将视图代码与DB代码分开,以封装视图逻辑:

查看代码的function包装:

 function delegateToView(data) { // process data here before sending to view // Render the display res.render('posts-resp', { title: res.app.settings.app_title, _use_Callback: _use_Callback, json: _json }); } 

带callback函数调用的DB代码:

  db.query('SELECT FOUND_ROWS() as num, UNIX_TIMESTAMP() as query_timestamp;', function(err, cnt_res){ if(err){ throw err; } cnt_res.fetchAll(function(err, cnt_rows){ var obj = { results:rows, total_results:cnt_rows[0].num, current_offset:self.offset, query_timestamp:cnt_rows[0].query_timestamp }; // ... ? //call your delegator here and pass in any needed data. // this keeps the actual view code separate. delegateToView(obj); }); }); 

现在,如果您的视图代码需要更改,您不需要触摸DB代码中的任何逻辑或callback函数中的任何逻辑。 祝你好运!