【问题标题】:Bluebird.js in Node and asynchronous api callsNode 中的 Bluebird.js 和异步 api 调用
【发布时间】:2014-02-08 01:42:29
【问题描述】:

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

我遇到的问题是,即使我(大概)使用 bluebird 来承诺 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);

【问题讨论】:

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


    【解决方案1】:

    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 为您创建包装器时不要创建 :)

    【讨论】:

    • 好吧,makeCall 的目的是在服务器创建之外定义我的 api 调用,以便以后可能重用。不过,我确实承认 new Promise.method 不是必需的。
    • @charlieg 不,我的意思是你可以直接调用 fb.apiAsync 而不是创建包装器
    • 啊,好吧。不过,我的问题实际上是围绕使用 Promises 展开的,在这里,使用 resolve/reject 函数的能力对我来说非常重要。
    • @charlieg fb.apiAsync 已经返回了一个承诺(该方法由promisifyall 添加)。您所做的所有工作本质上都是为了做出承诺,但是当您可以使用返回承诺的方法时,这完全是浪费......
    • 哦,是的,你是对的。您能否在答案中更清楚地说明这一点?然后我会把你的标记为正确的。谢谢!
    【解决方案2】:

    问题是我既没有返回承诺,也没有解决未返回的承诺。这是固定代码(有效!)

    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: ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 2015-08-04
      • 2013-08-15
      • 2019-03-21
      • 1970-01-01
      • 2018-04-09
      • 2015-09-03
      • 2016-07-25
      相关资源
      最近更新 更多