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

Javascript 从Node.js中的Promise(Bluebird)返回值,javascript,node.js,promise,restify,bluebird,Javascript,Node.js,Promise,Restify,Bluebird,我正在学习Node.js,正在学习Promise模块。我在这方面是个新手,所以请用糟糕的代码惯例和东西来解释。我正在尝试使用restify构建REST客户端API。我已在下面附上我的客户代码: 这是我的客户: // local functions function loadResult(err, req, res, obj) { //console.log(err, req, res, obj); var result = { 'err': err,

我正在学习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');
我可以在控制台上看到只打印一次结果。但这些数据正是我所相信的承诺。我有没有办法在数据中得到结果?还试图找出为什么结果没有第二次打印出来


附言:我尝试使用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) {

   });

看来你必须学会如何履行承诺:,@FelixKling你是对的。我是Javascript和Promises的初学者,但仍在努力了解它。因此,我们非常感谢您的帮助。仅供参考,我还是不明白我在做什么wrong@Darshan您没有解析承诺,请参阅您定义的
resolve
参数?你永远不会把它叫做任何地方。谢谢@Esailija,这是一个很棒的把戏。但它降低了我使用自定义标题的能力。有办法解决吗?@Darshan它是如何降低您使用自定义标题的能力的?如果这听起来很愚蠢,那么很抱歉,但是如果我这样做了
var json=promisifyAll(require(“restify”).JsonClient.prototype)我以一个客户端对象结束。我无法初始化它。当我尝试这样做时,我最终得到一个错误
var client=json()TypeError:object#的属性“json”不是repl:1:14的函数,并且我拥有的api没有任何自定义头的setter/options@Darshan这个承诺是作为课堂上的副作用来做的,在这里没有有用的结果。。。。不要将PromisifyAll的结果保存到任何地方,只需确保它已在应用程序中的某个地方调用过一次。谢谢@Esailija。我第一次搞错了:)。你的把戏真有帮助!