【发布时间】:2016-12-13 00:54:00
【问题描述】:
我使用 Javascript 的原生 Promise 制作了 fs.readFile 的“承诺”版本,它解析 JSON 文件并在解析时返回对象。
function readFileAsync(file, options) {
return new Promise(function (resolve, reject) {
fs.readFile(file, options, function(err, data) {
if (err) {
reject(err);
} else {
var object = JSON.parse(data);
resolve(object);
}
});
});
}
我首先尝试自己链接承诺,但由于某种原因,首先来自承诺 1 的 districts.variable1 被记录,然后在承诺 3 中调用 comparePersonalities,这会给出错误,因为用户仍未定义,然后是 @987654325 @ 从 promise 2 中记录。
var user, district;
readFileAsync(file1, 'utf8').then(function (data) {
districts = data;
console.log(districts.variable1);
}).then(readFileAsync(file2, 'utf8').then(function (data) {
user = data;
console.log(user.variable2);
})).then(function (result) {
comparePersonalities(districts, user);
}).catch(function (e) {
console.log(e);
});
我还尝试了使用Promise.all 的替代方法,但这仍然会导致错误的排序和comparePersonalities 失败。
Promise.all([readFileAsync(file1), readFileAsync(file2)]).then(function (first, second) {
districts = first;
user = second;
comparePersonalities(districts, user);
});
当在 Promise 中记录已解析的对象时,一切似乎都运行良好,我无法弄清楚为什么一切最终都被初始化,但最后一个 Promise 在第二个 Promise 完成之前运行。我在链式承诺和Promise.all 中做错了什么?
【问题讨论】:
-
then(readFileAsync是错误的。从那里开始。 -
你不能将promise (
readFileAsync(file2, 'utf8').then(…)) 传递给then,你需要传递一个函数!
标签: javascript node.js promise chaining