首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node-JS回调设计模式的应用

Node-JS回调设计模式的应用
EN

Stack Overflow用户
提问于 2016-08-18 22:06:21
回答 2查看 343关注 0票数 1

我相信我以基本的形式理解了回调的设计模式。但是,我不知道是否以及如何将此设计模式应用于这种更复杂的情况。

我正在编写一组要在服务器端使用的JavaScript函数。这些函数必须返回从本地数据库获取的数据,否则返回从外部API获取的数据。总而言之,我想做的是:

代码语言:javascript
复制
//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。

因为代码在不同的文件中,使用这么多回调会让我发疯。那么如何在这两个或更多级别的深度函数调用中使用回调呢?

EN

回答 2

Stack Overflow用户

发布于 2016-08-18 22:45:51

我会鼓励你去追求承诺而不是回调。回调的问题是,它可能会在最后变得非常混乱。

对于你的问题,一个非常好的解决方案应该是这样的。

代码语言:javascript
复制
//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,然后等待结果

代码语言:javascript
复制
DataProvider.getSpecificData().then(function(result){
  //result will have your data
})

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2016-08-18 23:44:52

假设您的DB和API模块也使用回调模式,那么您应该使用回调参数扩展getSpecificData()方法。然后使用DB的令人满意的结果或API的结果调用此回调方法:

代码语言:javascript
复制
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
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39020342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档