Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何支持我使用回调或设置超时?_Javascript_Express_Callback - Fatal编程技术网

Javascript 如何支持我使用回调或设置超时?

Javascript 如何支持我使用回调或设置超时?,javascript,express,callback,Javascript,Express,Callback,我需要将数据从fileExistance推送到result,并将结果导出到router文件夹中的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:12

我需要将数据从fileExistance推送到result,并将结果导出到router文件夹中的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)
这是路由器文件夹中的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
    });
  });
});
常量路径=要求“路径”; const express=需要“express”; const router=express.router; 常数fs=要求“fs”; var budgetController=require'/../controller/budget'; console.logresult+budgetController.result; 路由器。获取'/budget',请求,资源,下一步=>{ const result=budgetController.result; console.logresult; res.render“预算”{ 结果, 页面标题:“预算”, 路径:“/budget”, hasResults:result.length>0, 活动预算:是的, productCSS:对 }; }; 路由器。post'/budget',req,res,next=>{ log{title:req.body.title}.title; push{title:req.body.title}.title; 资源重定向“/预算”; }; exports.router=路由器; 路由器文件夹中的budget.js确实将数据输入结果。我不知道如何使用回调,而且我对Javascript非常陌生。
我该如何修复此问题?

您的代码当前存在争用条件。fs.readdir就是所谓的异步函数,因为它需要一些时间来完成它需要做的事情。因此,你告诉fs.readdir嘿,去做你需要做的事情,准备好后给我回电话。准备好后,执行我在functionerr文件中指定的操作{

您正在导入第一个文件,但不能保证它会在任何时间段内填充结果。如果您的路由使用得很快,结果将为空

您需要做的是将fileExistance转换为一个函数,该函数在填充结果后接受回调。执行此操作的函数是一个返回所谓承诺的函数

我建议您在继续前进之前,先考虑一下并理解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
    });
  });
});