Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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_Node.js_Asynchronous - Fatal编程技术网

Javascript 如何在一个接一个/一个完全完成后执行这些功能?

Javascript 如何在一个接一个/一个完全完成后执行这些功能?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有以下函数,它没有按照我希望的顺序执行 回调函数中的console.log实际上在函数本身中的循环执行之前被触发。总之,我希望函数“getFiles”在下一个“createDatabase”开始执行之前完全完成 谢谢你的帮助。 我已经对这个问题发疯了:( 该问题与对异步代码使用forEach循环有关。此答案对此问题有更多说明: 我不太确定您到底想做什么,但问题似乎出在您的run函数中。您没有在run中调用getFiles函数。您只关心函数名。还需要将getFiles包装成它应该是的样子 con

我有以下函数,它没有按照我希望的顺序执行

回调函数中的console.log实际上在函数本身中的循环执行之前被触发。总之,我希望函数“getFiles”在下一个“createDatabase”开始执行之前完全完成

谢谢你的帮助。 我已经对这个问题发疯了:(


该问题与对异步代码使用forEach循环有关。此答案对此问题有更多说明:


我不太确定您到底想做什么,但问题似乎出在您的run函数中。您没有在run中调用getFiles函数。您只关心函数名。还需要将
getFiles
包装成它应该是的样子

const run = async () => {
  await getFiles();
  await createDatabase();
  process.exitCode = 0
}

这对于使用较新的
fs.promises
接口进行编码非常简单,因此您可以
等待
readdir()
输出:

const fsp = require('fs').promises;
const path = require('path');

const async getFiles = () => {
  const root = "./database/test/";
  let files = await fsp.readdir(root);
  return files.map(file => {
      require(path.join(root, file));
      return Number(file.split(".")[0]);
  });
}

const createDatabase = (data) => {
  data.sort((a, b) => {
    return a-b
  })
  console.log(data)
  // Do some other stuff
}

const run = async () => {
  let data = await getFiles();
  createDatabase(data);
  process.exitCode = 0
}

run().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});
更改摘要:

  • 使用fs.promises接口,以便我们可以
    等待
    readdir()的结果
  • getFiles()
    更改为
    async
    ,这样我们就可以使用
    await
    ,这样它会返回一个承诺,当所有异步工作完成时,该承诺就会得到解决
  • 数据
    移动到函数中(从
    getFiles()
    解析并传递到
    createDatabase()
    ),而不是多个函数共享的顶级变量
  • 跟踪调用
    run()
  • run()
    中,实际调用
    getFiles()
    ,并在后面加上参数

  • 下面的代码段将首先完全运行getFiles函数,然后运行createDatabase函数。要使用async/await,函数需要返回承诺(阅读关于承诺的内容)


    由于createDatabase函数现在没有返回任何承诺,您可以删除它前面的Wait。只有在承诺返回时才使用Wait。您可以阅读async/Wait。

    我不确定Wait关键字是如何工作的,但为什么您要使用
    getFiles
    然后使用
    createDatabase()
    (括号内),它们不是都是函数吗?
    等待getFiles
    1。这将不会执行函数2。即使执行函数,也不会返回承诺,因此等待它是没有用的。缺少的括号是一个输入错误。对此表示抱歉。
    getFiles()
    不会返回链接到它的完成的承诺,因此执行
    等待getFiles()
    不会等待它完成。这仍然不能确保在执行
    createDatabase
    之前执行
    getFiles
    中的所有操作。为了实现“getFiles”,必须更改哪些操作在调用“createDatabase”之前被完全执行?我的错是,我看了某个人在其中一个答案中编写的代码,而不是原来用Promise包装getFiles的帖子。太棒了,非常感谢:)这正是我回到正轨所需要的:)[我很想对你的答案投赞成票,但现在还不允许这样做:(]嘿@jfriend00,你的代码运行得很好。不幸的是,我现在无法将同步.map调用设置为“做一些其他事情”。我希望它在脚本末尾的.then函数开始运行之前完全执行。已经用不同的方法尝试过了,但控制台.log(“全部完成”)始终在.map函数完成之前执行:(有什么想法吗?@Architecd-听起来像是在.map()中执行了一个异步操作,.map()不支持异步。我建议在实际代码中发布一个新问题。非常感谢:)这也很有吸引力,并清楚地解释了我如何修改代码以使其在将来正常工作。@Architecd很高兴能够提供帮助。还有一个更新,即使用try-catch块使用async/await进行错误处理。嗨,Elllgeemm,欢迎使用Stack Overflow!请引用您链接到的答案的相关部分,以便此答案可以继续独立完成。
    const fsp = require('fs').promises;
    const path = require('path');
    
    const async getFiles = () => {
      const root = "./database/test/";
      let files = await fsp.readdir(root);
      return files.map(file => {
          require(path.join(root, file));
          return Number(file.split(".")[0]);
      });
    }
    
    const createDatabase = (data) => {
      data.sort((a, b) => {
        return a-b
      })
      console.log(data)
      // Do some other stuff
    }
    
    const run = async () => {
      let data = await getFiles();
      createDatabase(data);
      process.exitCode = 0
    }
    
    run().then(() => {
        console.log("all done");
    }).catch(err => {
        console.log(err);
    });
    
    const fs = require("fs")
    let data = []
    
    const getFiles = () => {
      return new Promise((resolve, reject) => {
        fs.readdir("./database/test/", (err, files) => {
          if (err) {
            reject(err);
          }
          files.forEach(file => {
            require("../database/test/" + file)
            data.push(Number(file.split(".")[0]))
            console.log(data)
          })
          resolve(true);
        })
      })
    }
    
    const createDatabase = () => {
      data.sort((a, b) => {
        return a-b
      })
      console.log(data)
      // Do some other stuff
    }
    
    
    const run = async () => {
      await getFiles();
      await createDatabase();
      process.exitCode = 0;
    }
    
    run()