我在node.js中有一个模块,它通过sequelize lib连接postgres数据库。我的模块代码基本上是:

// ofr-network/index.js
var requireDir = require('require-dir');
var models = requireDir('./models');

var network = {
  getReportsFromCity: function(cityId) {
    models.index.reports.findAll({
      where: { id: cityId },
      attributes: ['id', 'latitude', 'longitude']
    }).then(function(reports) {
      console.log('[NETWORK-OFR] Get reports from %s', cityId);
      return reports;
    }).catch(function(err){
      console.log('Error getting reports from %s', cityId);
      console.log(err);
    });
  }
}

module.exports = network;

好吧,这个代码工作得很好。现在我尝试在我的express应用程序中使用这个模块,导入并调用这个方法,但是这段代码没有返回任何内容。我搜索了一下,发现一旦上面的代码是异步的,我就必须使用promises。
我的api方法代码如下:
var express = require('express');
var app = express();
var router = express.Router();
var network = require('ofr-network');
var Promise = require('bluebird');

router.get('/', function(req, res) {
  var getReports = Promise.promisify(network.getReportsFromCity, network);
  getReports(538).then(function(reports) {
    console.log('DONE');
    // this print isn't running
  }).catch(function(err){
    console.log(err);
  });
  res.render('index.html', { title: 'Title page' });
});

module.exports = router;

有人能帮我吗?

最佳答案

承诺代表价值+时间。承诺是有状态的,它们开始是待定的,并且可以满足于:
完成意味着计算成功完成。
拒绝表示计算失败。
返回承诺的函数(如sequenceize函数)允许您使用then钩住那些在前一个承诺实现时运行的承诺。你可以把承诺连在一起(就像你做过的那样),但别忘了把它们放到外面。承诺使用钩子的返回值。
return接受一个以Promise.promsify格式接受回调的函数-在已经使用promises的代码中这是不必要的。这对promisification是有用的,但这里不是这样。
取而代之的是-你只需要归还承诺,这样你就可以使用它:

var network = {
  getReportsFromCity: function(cityId) {
    return models.index.reports.findAll({ // NOTE THE RETURN
      where: { id: cityId },
      attributes: ['id', 'latitude', 'longitude']
    }).then(function(reports) {
      console.log('[NETWORK-OFR] Get reports from %s', cityId);
      return reports;
    }).catch(function(err){
      console.log('Error getting reports from %s', cityId);
      console.log(err);
    });
  }
}

你可以这样做:
network.getReportsFromCity(538).then(function(data){
    console.log("Data", data);
});

别忘了,promise不会将异步代码转换为同步代码,只是一个有用的工具——而不是魔法:)promise链之外的所有事情都可能在链本身运行之前发生。你的(err, data)放错地方了-你需要把它和相关的数据放在最后的res.render里。

关于javascript - Node.js中的 promise Bluebird 的麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27710140/

10-12 15:08