簡體   English   中英

我應該如何使用回調或 setTimeout?

[英]How am I suppoed to use callback or setTimeout?

我需要將 fileExistance 中的數據推送到結果中,並將結果導出到路由器文件夾中的 budget.js。 但我收到此錯誤消息

internal/validators.js:189

throw new ERR_INVALID_CALLBACK(callback);
^

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received []
    at setTimeout (timers.js:121:3)
    at Object.<anonymous> (C:\Users\Jaemin Windows10\GitHub\Jae_tasks\controller\budget.js:18:25)
const fs = require('fs');

var result = [];

const fileExistance = () => {
    fs.readdir('./data/budget', function(err, files) {
        if(err){
            console.log(err);
        } else if(!files.length) {
            return "No Transaction history";
        } else { 
            console.log("file Existance " + files);
            result.push(files);
        }
    });
}
fileExistance();
console.log("result " + setTimeout(result, 1000));
exports.result = result;

這是路由器文件夾中的budget.js

const path = require('path');

const express = require('express');

const router = express.Router();

const fs = require('fs');

var budgetController = require('./../controller/budget');


console.log("result " + budgetController.result);

router.get('/budget', (req, res, next) => {
   const result =  budgetController.result;
   console.log(result);
    res.render('budget', {
    prods: result,
    pageTitle: 'Budget',
    path:'/budget',
    hasResults: result.length > 0,
    activeBudget: true,
    productCSS: true
  });
});

router.post('/budget', (req, res, next) => {
    console.log({title: req.body.title}.title);
    filePath.push({title: req.body.title}.title);
    res.redirect('/budget');
});

exports.router = router;

router 文件夾中的 budget.js 確實將數據放入結果中。 而且我不太了解如何使用回調,而且我是 Javascript 的新手。 我該如何解決這個問題?

controller 文件夾中的 budget.js

const fs = require('fs');

let fileExistance = new Promise(function(resolve, reject) {
    fs.readdir('./data/budget', function(err, files) {
        if(err){
            console.log(err);
        } else if(!files.length) {
            resolve("No Transaction history");
        } else { 
            console.log("file Existance " + files);
           resolve(files);
        }
    });
});


exports.fileExistance = fileExistance;

路由器文件夾中的budget.js

router.get('/budget', (req, res, next) => {
      budgetController.fileExistance.then(function(data){
      console.log(data[0])
      res.render('budget', {
      prods: data,
      pageTitle: 'Budget',
      path:'/budget',
      hasData: data.length > 0,
      activeBudget: true,
      productCSS: true
    });
  });
});

您的代碼當前有競爭條件。 fs.readdir是所謂的異步 function 因為它需要一些時間來完成它需要做的事情。 正因為如此,你告訴fs.readdir “嘿,go 做你需要做的事情,當你准備好時“給我回電話”。當你准備好時,做我在function(err, files) {

您正在導入第一個文件,但不能保證它會在任何時間段內填充結果。 如果您的路線使用得很快,結果將為空白。

您需要做的是將fileExistance轉換為 function 在填充結果后進行回調。 執行此操作的 function 是 function ,它返回所謂的Promise

我建議您在繼續之前先玩弄並了解 javascript 的承諾。

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM