【问题标题】:Chain promises when rendering template渲染模板时的链式承诺
【发布时间】:2016-08-18 15:29:03
【问题描述】:

获取数据的函数。

获取连接并获取一些数据。省略了一些代码。

function executeSQL(sql, bindParams , options) {
  return new Promise(function(resolve, reject) {
    ...
    resolve(result);
  });
}

使用该功能的控制器

exports.index = function(req, res){

    database.executeSQL('SELECT 1 FROM DUAL', [] , {})

    .then(function(result) {
      res.render('index' , { TITLE : 'Lorem Ipsum Blog' });
    })

    .catch(function(err) {
      next(err);
    });
};

我的index 控制器用于我的index 路由。

我需要调用我的 executeSQL 函数至少两次。只有在它们都完成之后,我才想调用res.render 并发送我获取的数据。

如何链接它们? 我什至需要链接它们吗?我可以异步执行它们吗?一旦它们都完成了,我就打电话给res.render

【问题讨论】:

  • Promise.all(arr).then 怎么样?
  • @RayonDabre 当我在 result1 上运行 console.log 时,它返回未定义。我的渲染函数没有从这两个承诺中得到结果。
  • 我的坏...请参阅:jsfiddle.net/rayon_1990/Lson6f62/1
  • @RayonDabre 谢谢,您想在回答时发布吗?
  • 如果这有帮助,我不会介意的!

标签: javascript express handlebars.js es6-promise


【解决方案1】:

使用Promise.allPromise.all(iterable) 方法返回一个 Promise,当 iterable 参数中的所有 Promise 都已解析时,该 Promise 将解析。

function executeSQL(sql, bindParams, options) {
  return new Promise(function(resolve, reject) {
    resolve(result);
  });
}
exports.index = function(req, res) {
  var pro1 = database.executeSQL('SELECT 1 FROM DUAL', [], {});
  var pro2 = database.executeSQL('SELECT 1 FROM DUAL', [], {});
  Promise.all([pro1, pro2]).then(function(result) {
    console.log(result); //result will be an array
    res.render('index', {
      TITLE: 'Lorem Ipsum Blog'
    });
  }).catch(function(err) {
    next(err);
  });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2016-06-24
    • 2014-08-12
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多