承诺的返回值不稳定

时间:2018-12-03 11:46:35

标签: javascript promise async-await fs

我仍在尝试了解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]);
    });
});

2 个答案:

答案 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);
});
相关问题