【发布时间】:2015-08-05 03:09:39
【问题描述】:
我使用以下代码读取 json 文件并返回一个 promise 我有两个问题
return globAsync("folder/*.json").catch(function (err) {
throw new Error("Error read: " + err);
}).map(function (file) {
return fs.readFileAsync(file, 'utf8')
.then(function (res) {
console.log("test");
return JSON.parse(res);
},
function (err) {
throw new Error("Error :" + err);
}).then(function () {
console.log("test2");
});
});
我使用控制台日志,我看到控制台打印了两次
test
test
test2
test2
为什么会发生以及如何避免?
- 在我放置
console.log("test2");的地方我需要调用事件 json 解析完成并且仍然返回到 json 对象之外(给调用者),当我添加最后一个then它不起作用(返回的对象未定义),知道该怎么做吗?
更新我尝试跟随它不起作用...
return globAsync("folder/*.json").catch(function (err) {
throw new Error("Error read: " + err);
}).map(function (file) {
return fs.readFileAsync(file, 'utf8')
.then(function (res) {
console.log("test");
JSON.parse(res); //data parse
}.catch(function (err) {
throw new Error("Error :" + err);
}
).then(function (data) {
obj.emit('ready');
return data;
}))
});
}
UPDATE2 我可以通过简单地添加新的return JSON.parse(res); 来解决它
现在我应该如何解决方法调用两次
【问题讨论】:
-
我猜它被调用了两次,因为 globAsync 返回一个长度为 2 的数组。我不明白你的第二个问题
-
@JaromandaX - 有一种方法可以通过 promises 功能避免这种情况,因为它是多余的......第二个问题是假设我需要在 parse.json 完成时调用某个事件,在哪里以及如何这样做?
-
@JaromandaX - 另见我更新的问题,也许现在问题 2 更清楚......
-
只是说,
obj.emit('ready');几乎没有意义。只需将承诺用作承诺,否则您将依赖obj事件发射器。
标签: javascript promise bluebird