使用Node-JS应用callbackdevise模式

我相信我理解一个基本forms的callback的devise模式。 然而,我不知道是否以及如何将这种devise模式应用于这种更复杂的情况。

我正在编写一组JavaScript函数用于服务器端。 如果可能的话,这些函数必须返回从本地数据库获取的数据,否则返回来自外部API的数据。 总之,我想要做的是:

//dataProvider.js function DataProvider (dbCredentials, apiCredentials) { DB = require('./dbStuff'); API = require('./apiStuff'); this.db = new DB(dbCredentials); this.api = new API(apiCredentials); this.getSpecificData = getSpecificDataWrapper(this.db, this.api); } function getSpecificDataWrapper(db, api) { return function (extraQueryInfo) { var result = db.genericGetFunc(specificDBQuery); if (!satisfyingResult(result)) { result = api.genericGetFunc(specificAPIQuery); return result; } } 

当从主app.js文件调用此函数,我想这样做dataProviderInstance.getSpecificData(extraQueryInfo) 。 现在我有一个类似的结构设置为执行查询的数据库和API函数。 但是,由于这些查询需要时间, getSpecificData总是返回undefined。

由于代码是在不同的文件,使用这么多的电话会让我疯狂。 那么如何使用这两个或更多级别的函数调用callback?

我会鼓励你去承诺,而不是callback。 callback的问题在于它最终会变得非常混乱。

对于你的问题一个非常好的解决scheme将是这样的。

 //dataProvider.js function DataProvider (dbCredentials, apiCredentials) { DB = require('./dbStuff'); API = require('./apiStuff'); this.db = new DB(dbCredentials); this.api = new API(apiCredentials); this.getSpecificData = getSpecificDataWrapper(this.db, this.api); } function getSpecificDataWrapper(db, api) { return new Promise(function (resolve, reject) { //I Assume that if this is an async operation, either receives a callback //function or returns a promise. db.genericGetFunc(specificDBQuery) .then (function(result) { if (satisfyingResult(result)) resolve(result) // Again, I Assume that if this is an async operation, either receives a //callback function or returns a promise. else return api.genericGetFunc(specificAPIQuery); }) .then (function(result){ resolve(result); }) .catch (function(err){ reject(err); }) }); } 

假设您的DB和API模块也使用callback模式,那么您应该使用callback参数扩展getSpecificData()方法。 然后调用这个callback方法,得到一个令人满意的数据库结果或者API的结果:

 function getSpecificDataWrapper(db, api) { return function (extraQueryInfo, callback) { db.genericGetFunc(specificDBQuery, function(result){ if(satisfyingResult(result)){ callback(result); } else { api.genericGetFunc(specificAPIQuery, function(result){ callback(result); }); } }); } } dataProviderInstance.getSpecificData(extraQueryInfo, function(result){ // handle result here }); 
Interesting Posts