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

我正在学习Node.js,正在查看Promise模块。 我很新,所以请用不好的代码约定和东西。 我正在尝试使用restify构buildREST客户端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'); 

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

PS:我尝试使用Promise.promisifyAll(require('restify')),但它一直抛出一些错误,说fn不是强制使用Promise的函数。

首先,当我这样做的时候没有这样的错误:

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

其次,restify在导出模块的时候不幸地使用了一些怪异的getter,因为getters可以(而且确实)有副作用,promisifyAll不会访问它们,所以一行魔术就行不通了。 你需要手动提交这些类,例如

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

那么你会打电话给:

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