Нестабильное возвращаемое значение из обещания - PullRequest
0 голосов
/ 03 декабря 2018

Я все еще пытаюсь понять синхронность в 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 голосов
/ 03 декабря 2018

Ваш код не будет работать, потому что вы ждете только одно обещание, вам нужно использовать Promise.all (arrayOfPromises), этот метод вернет новое обещание, которое запускается только после того, как все обещания в массиве выполнены.

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););
});

Примечание: обещание «все» будет отклонено, если одно из внутренних обещаний будет отклонено, поэтому в случае, если вы захотите проигнорировать этот случай и суммировать остальные обещания, вам необходимо разрешитьобещание с «пустыми» значениями, а затем позаботиться об этом при суммировании в финале.

0 голосов
/ 03 декабря 2018
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);
});
...