鍍金池/ 問答/HTML/ koa 接口異步返回?cái)?shù)據(jù)問題

koa 接口異步返回?cái)?shù)據(jù)問題

用koaJS實(shí)現(xiàn)了一個(gè)接口,接口里面讀取了一個(gè)文本文件,但是返回?cái)?shù)據(jù)的時(shí)候不能等待文件處理完成后返回?cái)?shù)據(jù),而是在最外層才能返回?cái)?shù)據(jù)。求解。
已解決,附上代碼


'use strict';
const readline = require('readline');
const fs = require("fs");
const path = require('path');

module.exports = async function (ctx) {
    let filePath = path.resolve(__dirname, '../../../../public/assets/a.txt');
    try {
        const result = await readFile(filePath);
        //區(qū)分結(jié)果頁和情景頁
        let atom_wise = [];
        let atom_card = [];
        let atom_wise_sum = 0;
        let atom_card_sum = 0;
        
        for (let i = 0; i < result.length; i++) {
            // 遍歷單個(gè)卡片
            for (let j = 0; j < result[i].length; j++) {
                // 結(jié)果頁卡片
                if(result[i][j] === '1'){
                    atom_wise_sum++;
                    atom_wise.push(result[i]);
                }
                // 情景頁卡片
                if(result[i][j] === '2' ){
                    atom_card_sum++;
                    atom_card.push(result[i]);                    
                }
                
            }
        }

        ctx.json({
            status: 0,
            msg: '成功',
            atom_wise_sum,
            atom_card_sum,
            atom_wise,
            atom_card
        });

    } catch (e) {
        console.error(e);
        ctx.json({
            status: 1,
            msg: '失敗'
        });
    }


};

function readFile(filePath) {
    console.log('開始讀取文件...');
    let input = fs.createReadStream(filePath);
    const rl = readline.createInterface({
        input
    });
    let result = [];
    let lineData;

    return new Promise((resolve, reject) => {
        rl.on('line', (line) => {
            if (line.split(/\s+/)[4] === 'atom') {
                lineData = line.split(/\s+/);
                result.push(lineData);
            }
        });

        rl.on('close', (line) => {
            console.log("讀取文件完畢!");
            resolve(result);
        });

        rl.on('error', reject);
    });

}
回答
編輯回答
扯不斷

文件處理包裝成Promise,然后使用async await就可以了

2017年12月10日 09:56
編輯回答
憶當(dāng)年
'use strict';
const readline = require('readline');
const fs = require("fs");  
const path = require('path');

module.exports = async function (ctx) {
    let filePath = path.resolve(__dirname, '../../../../test/a.txt');
    try {
        const result = await readFile(filepath);
        
        ctx.json({
            status: 0,
            msg: '成功2',
            result,
        }); 

    } catch (e) {
        ctx.json({
            status: 1,
            msg: '失敗',
            result,
        }); 
    }

        
};

function readFile(filePath) {
    let input = fs.createReadStream(filePath);
    const rl = readline.createInterface({
        input
    });
    let result = [];
    let lineData;

    return new Promise((resolve, reject) => {
      rl.on('line', (line) => {
          if(line.split(/\s+/)[4] === 'atom'){
              lineData = line.split(/\s+/);
              result.push(lineData);
          }
      });
      
      rl.on('close', (line) => {
          console.log(result);
          console.log("讀取完畢!");

          resolve(result);
      });

      rl.on('error', reject);
    });
    
}
2017年11月23日 08:36