从 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) {
});
我正在学习 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) {
});