Node中的Bluebird.js和异步api调用

Cha*_*e G 2 javascript facebook node.js facebook-node-sdk bluebird

所以我正在尝试使用Facebook集成构建我的第一个webapp(使用facebook-node-sdk).我让它对api进行简单的调用,但是现在是时候将它们放在一个简单的服务器中并根据请求进行调用(这不是webapp本身,而是更多的API服务器).

我遇到的问题是,即使我(大概)使用蓝鸟来宣传Facebook sdk和我的makeCall方法,我仍然得到"hi"打印然后"未定义" - 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);
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 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);
Run Code Online (Sandbox Code Playgroud)

当promisifyAll为你做的时候不要创建包装器:)