从 Node.js 中的 Promise(Bluebird) 返回值

Returning values from Promise(Bluebird) in Node.js

我正在学习 Node.js 并且正在研究 Promise 模块。我在这方面很陌生,所以请公开糟糕的代码约定和内容。我正在尝试使用 restify 构建一个 REST 客户端 API。我在下面附上了我的客户代码:

这是我的客户:

// local functions
function loadResult(err, req, res, obj) {
    //console.log(err, req, res, obj);
    var result = {
        'err': err,
        'text': obj
    };
    console.log(result);
    return result;
}

function getClient() {
    if (client) {
        return client;
    } else {
        client = restify.createJsonClient(options);
        return client;
    }
};

function RestClient(headers) {

    if (headers) {
        global_headers.Authorization = headers.Authorization || global_headers.Authorization;
        options.headers = global_headers;
    }
};

RestClient.prototype.getClient = getClient;

RestClient.prototype.doGET = function doGET(path) {
    return new Promise(function(resolve) {
        client.get(path, loadResult);
    }).then(function(result) {
        console.log("before final return:" + result);
        return result;
    });
};

// exports
module.exports = RestClient;

当我运行以下行时在控制台中:

var Rest = require('./testRest.js');
var restClient = new Rest();
var client = restClient.getClient();
var data = restClient.doGET('/hello/mark');

我可以看到在控制台上只打印了一次结果。但数据正是我所相信的承诺。有没有办法让我得到数据的结果?还试图弄清楚为什么结果从未被第二次打印出来。

P.S.: 我尝试使用 Promise.promisifyAll(require('restify')) 但它一直抛出一些错误,说 fn 不是一个强制以这种方式使用 Promise 的函数。

首先我做的时候没有出现这样的错误:

var Promise = require("bluebird");
Promise.promisifyAll(require("restify"));

其次,不幸的是,restify 在导出模块时使用了一些奇怪的 getter,因为 getter 可能(并且确实)有副作用,promisifyAll 不会访问它们,所以单行魔术将不起作用。您需要手动承诺 类,例如

Promise.promisifyAll(require("restify").JsonClient.prototype);

然后你会打电话给:

   client.getAsync(path).spread(function(req, res, obj) {

   });