2

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

我遇到的问题是,即使我(大概)使用bluebird来承诺 Facebook sdk 和我的makeCall方法,我仍然打印“hi”然后“undefined” -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);
4

2 回答 2

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 为你做这件事时,不要创建包装器:)

于 2014-01-19T10:10:58.120 回答
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: ... }
于 2014-01-18T18:27:44.733 回答