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

时间:2014-01-18 17:55:16

标签: javascript facebook node.js bluebird facebook-node-sdk

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

我遇到的问题是,即使我(大概)使用bluebird来宣传Facebook sdk和我的makeCall方法,我仍然会得到“hi”打印然后“未定义” - 在makeCall返回任何内容之前调用console.log

这是我的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);

2 个答案:

答案 0 :(得分: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为你做的时,不要创建包装器:)

答案 1 :(得分: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: ... }