2016-01-26 3 views
0

Я новичок в Promise, и мне трудно создать Promise, который будет включать функцию Sequelize, которая уже использует Promise.NodeJS - Создайте функцию Promise, которая использует функцию Sequelize

Я хотел бы что-то вроде этого:

var geojson = require(path.join(__dirname, 'lib', 'geojson'); 

router.get('/[0-9]{3}/points.geojson', function(req, res, next){ 
    var codecs = req.url.split('/')[1]; 
    geojson.pointsToGeoJSON(codecs).then(function(geoJSON){ 
     res.writeHead(200, {'Content-Type': 'application/json'}); 
     res.end(JSON.stringify(geoJSON)); 
    }); 
}); 

./lib/geojson.js:

var path = require('path'); 
var Promise = require('promise'); 
var Geojson = require('geojson'); 
var Point = require(path.join(__dirname, '..', '..', 'models', 'point')); 

module.exports = { 
    pointsToGeoJSON: function(codecs) { 

     //this is a Sequelize function 
     Point.findAll({where: {codecs : codecs}, raw: true}) 
     .then(function(points){ 
      var data = []; 
      for(var i=0; i < points.length; i++){ 
       points[i].coordinates = JSON.parse(points[i].coordinates); 
       data.push(points[i]); 
      } 

      //this is another asyn function 
      Geojson.parse(data, {'crs': {'type': 'name', 'properties': {'name': 'EPSG:3857'}}, 'Point': 'coordinates'}, function(geoJSON){ 

       //this is what I want the function to return 
       return geoJSON; 
      }); 
     }); 
    } 
} 

Как я могу сделать выше pointsToGeoJSON функцию использовать Promise, для того, чтобы иметь возможность использовать .then()

+0

Используйте синюю птицу, чтобы обещать все. '' 'npm install bluebird --save'''. Я использовал его в каждом проекте. https://github.com/petkaantonov/bluebird –

+0

is'nt то же самое, что и обещание npm? –

+0

Да и нет. Да, он может создавать единые обещания, как в вашем случае, но также имеет функцию '' 'promisifyAll''', которая может обещать целую библиотеку. Это всего лишь предложение. Вот почему я не опубликовал его в качестве ответа. –

ответ

1

У вас уже есть Обещания, поэтому просто сделайте так: var path = require ('path'); var Promise = require ('prom'); var Geojson = require ('geojson'); var Point = require (path.join (__ dirname, '..', '..', 'models', 'point'));

module.exports = { 
    pointsToGeoJSON: function(codecs) { 

     //this is a Sequelize function 
     return Point.findAll({where: {codecs : codecs}, raw: true}).then(function(points){ 
      var data = []; 
      for(var i=0; i < points.length; i++){ 
       points[i].coordinates = JSON.parse(points[i].coordinates); 
       data.push(points[i]); 
      } 

      //this is another asyn function 
      return new Promise(function(resolve, reject){ 
       Geojson.parse(
        data, 
        {'crs': {'type': 'name', 'properties': {'name': 'EPSG:3857'}}, 'Point': 'coordinates'}, 
        function(geoJSON){ 
         resolve(geoJSON); 

        }); 
      }); 
     }); 
    } 
}; 

См. Ссылку @bergi для объяснения использования обещаний с обратными вызовами и некоторыми альтернативами.

+0

Я не могу заставить его работать, когда делаю 'geojson.pointsToGeoJSON (кодеки). Then (function (geoJSON) {..' I получил ошибку undefined не имеет функции. then –

+0

Вам также нужно было вернуть обещание от pointToGeoJSON, только что отредактировал мой ответ, чтобы включить полное решение. – bknights

+0

ok, но у меня есть эта ошибка: 'Unhandled rejection (<{" type ":" FeatureCollection "," features "...>, no stack trac e)' ?? –

Смежные вопросы