2014-01-18 4 views
2

Итак, я пытаюсь создать свой первый webapp с интеграцией Facebook (используя facebook-node-sdk). У меня есть простые вызовы api, но теперь пришло время поставить все это на простом сервере и сделать запросы по запросу (это не будет сам webapp, а скорее сервер API).Bluebird.js в узлах и асинхронных вызовах api

Проблема я бегу в том, что, несмотря на то, что я (предположительно) используется для bluebird Promisify в Facebook SDK и мой makeCall метод, я все еще получаю «привет» печатается, а затем «неопределенные» - console.log вызывается до того, как makeCall может что-то вернуть.

Вот мой app.js:

var Promise = require('bluebird') 
    , http = require('http') 
    , Facebook = Promise.promisifyAll(require('facebook-node-sdk')) 
    , config = require('./config') 
    , fb = new Facebook({ appId: config.fb.api, secret: config.fb.secret }); 

var makeCall = new Promise.method(function (username) { 
    return fb.api(username, function(err, data) { 
     console.log('hi') 
     if (err) return err; 

     return data; 
    }); 
}); 

http.createServer(function (req, res) { 
    makeCall('/me').then(console.log) 
}).listen(8001); 

ответ

3

Проблема заключалась в том, что я не был ни возвращающая обещание ни был, я сказал разрешение не-вернулись обещания. Вот фиксированный код (который работает!)

var Promise = require('bluebird') 
    , http = require('http') 
    , Facebook = Promise.promisifyAll(require('facebook-node-sdk')) 
    , config = require('./config') 
    , fb = new Facebook({ appId: config.fb.api, secret: config.fb.secret }); 

var makeCall = new Promise.method(function (username) { 
    return new Promise(function (resolve) { 
     // resolve 
     console.log('resolve') 
     fb.api(username, function(err, data) { 
      console.log('err: ' + err) 
      console.log('data: ' + data) 
      if (err) reject(err); 

      resolve(data); 
     }); 
    }); 
}); 

http.createServer(function (req, res) { 
    makeCall('/me').then(function (data) { 
     console.log(data) 
    }) 
}).listen(8001); 

Где выход выглядит следующим образом:

resolve 
err: null 
data: [object Object] 
{ id: ... } 
7

new Promise.method не имеет смысла здесь (или в любом месте, так как это функция, а не конструктор) и не делает makeCall.

Попробуйте это:

var Promise = require('bluebird') 
    , http = require('http') 
    , Facebook = require('facebook-node-sdk') 
    , config = require('./config') 
    , fb = new Facebook({ appId: config.fb.api, secret: config.fb.secret }); 

Promise.promisifyAll(Facebook.prototype); 

http.createServer(function (req, res) { 
    fb.apiAsync('/me').then(function (data) { 
     console.log(data) 
    }) 
}).listen(8001); 

Не создавать обертки, когда promisifyAll делает это для вас :)

+0

Ну, цель 'makeCall' чтобы определить мой апи вызов вне создания сервера для возможно, повторно использовать позже. Однако я признаю, что «новый Promise.method» не нужен. –

+0

@charlieg no Я имею в виду, что вы можете просто называть 'fb.apiAsync' вместо создания обертки – Esailija

+0

Ah okay. Однако мой вопрос действительно связан с использованием обещаний, и возможность использования функций разрешения/отклонения действительно важна для меня здесь. –

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

  • Нет связанных вопросов^_^