使用async / await进行Lazyload

时间:2016-10-05 16:56:19

标签: javascript node.js asynchronous async-await ecmascript-2017

我使用此代码加载.eslintrc

const eslintrcs = {};
async function getLintOptions(path) {
    if (!eslintrcs[path]) {
        let eslintrc;
        try {
            eslintrc = await readFile('./.eslintrc');
            eslintrc = await readFile(`${path}/.eslintrc}`);
        } catch (err) {
            eslintrc = eslintrc || {};
        }
        eslintrcs[path] = JSON.parse(eslintrc);
        console.log(eslintrcs[path]);
    }

    return eslintrcs[path];
}

所以我这样点了我的文件:

        files.forEach(async (filePath) => {
            try {
                let code;
                if (!options.skipLint) {
                    logFileProgress('Linting', filePath);
                    code = await readFile(filePath);
                    const messages = linter.verify(code, await getLintOptions(path));

这里的问题是,由于代码是异步的,所以它在找到第一个await后停止并保持同步代码,结果就是这个:

info: 2016-10-05 18:47 - Linting: src/server/_config.js
info: 2016-10-05 18:47 - Linting: src/server/admin/router.js
info: 2016-10-05 18:47 - Linting: src/server/server.js
...
{ parser: 'babel-eslint',
  extends: 'airbnb',
  rules: { indent: [ 2, 4, [Object] ] } }
{ parser: 'babel-eslint',
  extends: 'airbnb',
  rules: { indent: [ 2, 4, [Object] ] } }
{ parser: 'babel-eslint',
  extends: 'airbnb',
  rules: { indent: [ 2, 4, [Object] ] } }

有没有办法在获得结果之前停止异步函数?

我甚至试图将getLintOptions移到forEach圈外:

        const eslintrc = await getLintOptions(path);
        files.forEach(async (filePath) => {
            try {
                let code;
                if (!options.skipLint) {
                    logFileProgress('Linting', filePath);
                    code = await readFile(filePath);
                    const messages = linter.verify(code, eslintrc);

0 个答案:

没有答案