我相信我以基本的形式理解了回调的设计模式。但是,我不知道是否以及如何将此设计模式应用于这种更复杂的情况。
我正在编写一组要在服务器端使用的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。
因为代码在不同的文件中,使用这么多回调会让我发疯。那么如何在这两个或更多级别的深度函数调用中使用回调呢?
发布于 2016-08-18 22:45:51
我会鼓励你去追求承诺而不是回调。回调的问题是,它可能会在最后变得非常混乱。
对于你的问题,一个非常好的解决方案应该是这样的。
//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);
})
});
}
因此,getSpecificData函数将返回一个只需链接的promise...you,然后等待结果
DataProvider.getSpecificData().then(function(result){
//result will have your data
})希望这能有所帮助!
发布于 2016-08-18 23:44:52
假设您的DB和API模块也使用回调模式,那么您应该使用回调参数扩展getSpecificData()方法。然后使用DB的令人满意的结果或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
});https://stackoverflow.com/questions/39020342
复制相似问题