>source

Promise 문에서 얻은 값을 반환하려고하는데 Promise {undefined}가 계속 표시됩니다. 누군가 올바르게 수행하는 방법을 알고 있습니까? .ejs 파일을 데이터로 렌더링하면 아무것도 얻지 못합니다.

// /documents/vocabulary file
async function transformar() {
    return new Promise(resolve => {
        fs.readFile('src/documents/Vocabulary2.txt', 'utf8', function(error, data) {
            if (data) {
                var d = data.split('\n');
                var a = []
                for (let i=0; i<d.length; i++) {
                    a.push({
                        eng: d[i].split('-')[0].trim(),
                        esp: d[i].split('-')[1].trim()
                    })
                }
                a.sort(dynamicSort('eng'));
                resolve(a);
            }
        });
    });
}
//index.js file
const vocabulary = require('./documents/vocabulary');
const myFunction = async () => {
    const data = await vocabulary.transformar();
    return data;
}
const vocab = myFunction();
console.log(vocab)
app.use('/', function(req,res){
    res.render(path.join(__dirname+'/Vocabulary.ejs'), {vocabulary_data: vocab});
});

읽어 주셔서 감사합니다!

  • 답변 # 1

    우선, 귀하의 transformar() 메서드는 실제로 약속을 반환하지 않습니다. 먼저 수행해야합니다.

    async function transformar() {
        return new Promise(resolve => {
            fs.readFile('src/documents/Vocabulary2.txt', 'utf8', function(error, data) {
                if (data) {
                    var d = data.split('\n');
                    var a = []
                    for (let i=0; i<d.length; i++) {
                        a.push({
                            eng: d[i].split('-')[0].trim(),
                            esp: d[i].split('-')[1].trim()
                        })
                    }
                    a.sort(dynamicSort('eng'));
                    resolve(a);
                }
            });
        });
    }
    
    

    최상위 수준 대기에 대한 지원이 없으므로 .then() 반환 된 약속에서 :

    vocabulary.transformar().then((data) => console.log('data', data));
    
    

    ... 또는 사용 await IIFE에서 :

    (async () => {
        const data = await vocabulary.transformar();
        console.log('data', data);
    })();
    
    

    Promise가 함수에서 실행되는 경우 간단히 await를 사용할 수 있습니다.

    const myFunction = async () => {
        const data = await vocabulary.transformar();
        console.log('data', data);
    }
    myFunction();
    
    

  • 답변 # 2

    이 코드를 시도해야합니다.

    async transformar() {
    return new Promise((resolve, reject) => {
      console.log('Sorting data');
      fs.readFile('src/documents/Vocabulary2.txt', 'utf8', async (error, data) => {
        if (data) {
          //format data on array-dict
          var d = data.split('\n');
          var a = []
          for (let i = 0; i < d.length; i++) {
            a.push({
              eng: d[i].split('-')[0].trim(),
              esp: d[i].split('-')[1].trim()
            })
          }
          //sort data
          await a.sort(dynamicSort('eng'));
          resolve(a);
        }
      });
    })
    }
    var data;
    vocabulary.transformar().then(result=>{
    data = result;
    console.log('data', data);
    });
    
    

  • 답변 # 3

    비동기 함수가 아무것도 반환하지 않습니다. 또한 fs.readFile 함수는 promise를 반환하지 않고 콜백을받습니다. 약속으로 포장하고 최종 가치로 해결해야합니다.

    function transformar() {
      return new Promise(function (resolve, reject) {
        fs.readFile(
          'src/documents/Vocabulary2.txt',
          'utf8',
          function (error, data) {
            if (data) {
              //format data on array-dict
              var d = data.split('\n');
              var a = [];
              for (let i = 0; i < d.length; i++) {
                a.push({
                  eng: d[i].split('-')[0].trim(),
                  esp: d[i].split('-')[1].trim(),
                });
              }
              //sort data
              a.sort(dynamicSort('eng'));
              resolve(a);
            } else {
              reject(new Error('No data was found.'));
            }
          }
        );
      });
    }
    transformar()
      .then(function (data) {
        console.log(data);
      })
      .catch(function (err) {
        console.error(err);
      });
    
    
    

관련 자료

  • 이전 python - Pandas DataFrame을 특정 주석이 달린 CSV 형식으로 변환하는 방법 (내부 설명)
  • 다음 reactjs - Azure B2C를 사용하여 보호 된 NET Core API에 액세스하는 React 앱에서 액세스 토큰을 가져올 수 없습니다