【发布时间】:2017-01-26 12:10:07
【问题描述】:
我正试图围绕 Promises(我知道这是一个常见的主题)来思考。我有基本的想法,但我在实施它们时遇到了麻烦。
我正在尝试构建一个对象,该对象根据目录的内容公开一组函数。我正在使用 bluebird 来承诺 fs 库。然后读入dir的文件,构建对象,返回结果。
var Promise = require('bluebird'),
fs = Promise.promisifyAll(require('fs'));
var services = {};
return fs.readdirAsync('./path/to/file/')
.each(function (filename) {
//trim off the file extension and assign the export function
services[filename.replace(/\.[^/.]+$/, "")] = function(request) {
request.esbOperation = filename;
otherFunctionCall(request);
}
})
.then(function() {
return {services: services};
})
.catch(function(err){
console.log(err);
});
我尝试了很多方法,但返回的对象通常如下所示:
Promise {
_bitField: 167772160,
_fulfillmentHandler0: undefined,
_rejectionHandler0:
{ services:
{ function1: [Function],
function2: [Function],
function3: [Function],
},
_promise0: undefined,
_receiver0: undefined }
如何在履行处理程序中获得结果? 如何让它返回已解决的对象而不是 Promise 对象(我在各个地方尝试过解决/拒绝,但我做错了)?
【问题讨论】:
-
你没有。你返回承诺(这是你所看到的,因为它已经在工作了)。这就是他们的目的。您不能立即返回将在未来计算的结果。
-
@Bergi 为什么在拒绝处理程序中?
-
@GForce 我无法说明为什么您的对象存储在
_rejectionHandler0属性中,但您不应该尝试从promise 的内部属性中获取值。你应该打电话给.then()和/或.catch()来处理它。 -
@GForce 因为 Bluebird 对内存非常谨慎。你不应该关心它的内部表示。