我仍在尝试了解JS中的同步性。以下脚本可以记录不同的值。如何确保它记录一个稳定值?感谢任何帮助。
// variable "all" is the array which holds the file path as string
all.forEach(async(f) => {
promise = new Promise((resolve, reject) => {
fs.readFile(f, 'utf8', function (err, content) {
if (!err) {
scenario += (content.match(/Scenario(\s?)\(\'/g) || []).length;
uc += (content.match(/\/\/(\s?)UC-(.)+/g) || []).length;
resolve([scenario, uc]);
} else {
reject('Error!');
}
});
});
await promise;
});
promise.then(([scenario, uc]) => {
console.log('Total Scenarios: ' + scenario);
console.log('Total UCs: ' + uc);
});
参考@Yftach和@Manjeet Thakur的答复。
此代码对我而言正常工作;
let promises = all.map(f => {
return new Promise((resolve, reject) => {
fs.readFile(f, 'utf8', function (err, content) {
if (!err) {
scenario += (content.match(/Scenario(\s?)\(\'/g) || []).length;
uc += (content.match(/\/\/(\s?)UC-(.)+/g) || []).length;
resolve([scenario, uc]);
} else {
reject('Error!');
}
});
});
});
Promise.all(promises).then((result) => {
let max = result.reduce((acc, curr) => {
return [Math.max(acc[0],curr[0]), Math.max(acc[1],curr[1])];
});
console.log('Total Scenarios: ' + max[0]);
console.log('Total UCs: ' + max[1]);
});
});
答案 0 :(得分:2)
您的代码将不起作用,因为您仅等待一个承诺, 您应该做的是使用Promise.all(arrayOfPromises),此方法将返回一个新的promise,仅在数组中的所有promise完成后才运行。
let allPromises = all.map((f) => {
promise = new Promise((resolve, reject) => {
fs.readFile(f, 'utf8', function (err, content) {
if (!err) {
scenario += (content.match(/Scenario(\s?)\(\'/g) || []).length;
uc += (content.match(/\/\/(\s?)UC-(.)+/g) || []).length;
resolve({scenario:scenario, uc:uc});
} else {
reject('Error!');
}
});
});
return promise;
});
Promise.all(allPromises).then((values) => {
// Sum all the scenarios and UCS, becase the values is an array of objects representing answers from each promise, we must sum them ourselves
console.log('Total Scenarios: ' + values.reduce((accumulated, current) => accumulated + current.scenario, 0);
console.log('Total UCs: ' + values.reduce((accumulated, current) => accumulated + current.uc, 0););
});
注意:如果内部承诺之一被拒绝,则“全部”承诺将被拒绝,因此,如果您想忽略该情况并求和其余的承诺,则需要用“空”解决承诺。 ”,然后在最后的总结中加以处理。
答案 1 :(得分:0)
var promises = all.map(f => {
return new Promise((resolve, reject) => {
fs.readFile(f, 'utf8', function (err, content) {
if (!err) {
scenario += (content.match(/Scenario(\s?)\(\'/g) || []).length;
uc += (content.match(/\/\/(\s?)UC-(.)+/g) || []).length;
resolve([scenario, uc]);
} else {
reject('Error!');
}
});
});
});
Promise.all(promises).then(([scenario, uc]) => {
console.log('Total Scenarios: ' + scenario);
console.log('Total UCs: ' + uc);
});