Javascript 从Node.js中的Promise(Bluebird)返回值
我正在学习Node.js,正在学习Promise模块。我在这方面是个新手,所以请用糟糕的代码惯例和东西来解释。我正在尝试使用restify构建REST客户端API。我已在下面附上我的客户代码: 这是我的客户: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,
// 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。我第一次搞错了:)。你的把戏真有帮助!