Javascript 多个函数的异步执行顺序,每个函数取决于最后一个函数

Javascript 多个函数的异步执行顺序,每个函数取决于最后一个函数,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我真的很难理解异步代码和回调函数 我想做一个函数序列,它取决于最后一个函数的结果。第一个函数将从数据库导入数据 导入值>fctOne(值)>fctTwo(fctOne(值))值>fctThree(fctTwo(值))值>等等 App.js需要等待导入值,所以fctOne不能同步。但是,我在它后面的所有函数也需要异步吗?它们必须按顺序运行 我的失败代码:错误为:“回调(结果)类型错误:回调不是函数” DB.JSON {"val":5,"square":25,

我真的很难理解异步代码和回调函数

我想做一个函数序列,它取决于最后一个函数的结果。第一个函数将从数据库导入数据

导入值>fctOne(值)>fctTwo(fctOne(值))值>fctThree(fctTwo(值))值>等等

App.js需要等待导入值,所以fctOne不能同步。但是,我在它后面的所有函数也需要异步吗?它们必须按顺序运行

我的失败代码:错误为:“回调(结果)类型错误:回调不是函数”

DB.JSON

{"val":5,"square":25,"SquareRoot":5,"dividedByHimself":1}
在app.js上

const db = require('./DB.json')
const fs = require('fs')
const path = require('path')
const dbPath = path.join(__dirname,'DB.json')
let data = fs.readFileSync(dbPath)
let userDBupdate = JSON.parse(data)


///function to import data with simulation of the delay to obtain imported value//
const value = (pathDB,callBack) => {
 setTimeout((err) => {
   if(err){
     return callBack(new Error("loading failed"))
   }
   const val = db[pathDB]
   callBack(val)
 }, 500)
}
//// square function 
let square = (pathDB, callBack) => {
 value(pathDB, (val) => {
   let result = val * val
   userDBupdate.square = result
   callBack(result)
   let dataMAJ = JSON.stringify(userDBupdate)
   fs.writeFileSync(dbPath, dataMAJ)
 })
}
square('val')

let squareRootOfSquare = (pathDB, callBack) => {
 square(pathDB, (val) => {
   let result = Math.sqrt(val)
   userDBupdate.square = result
   callBack(result)
   let dataMAJ = JSON.stringify(userDBupdate)
   fs.writeFileSync(dbPath, dataMAJ)
 })

}
squareRootOfSquare('val')




正如jfriend00所提到的,它试图使用promise重写它。是的,对于串行计算,它更容易和更干净

const valuePromise = new Promise((resolve,reject) => {
  setTimeout(()=> {
    const val = db.val
    resolve(val)
  })
}).then(function(resultOfCall){
  let resultSquare = resultOfCall * resultOfCall
    userDBupdate.square = resultSquare
    let dataMAJ = JSON.stringify(userDBupdate)
    fs.writeFileSync(dbPath, dataMAJ)
  return resultSquare
}).then(function(resultOfSquare){
  let resultRoot = Math.sqrt(resultOfSquare)
  userDBupdate.squareRootOfSquare = resultRoot
  let dataMAJ = JSON.stringify(userDBupdate)
  fs.writeFileSync(dbPath, dataMAJ)
  return resultRoot
}).then(function(resultOfSquareRoot){
  let resultOfDivide = resultOfSquareRoot / resultOfSquareRoot
  userDBupdate.squareRoot = resultOfDivide
  let dataMAJ = JSON.stringify(userDBupdate)
  fs.writeFileSync(dbPath, dataMAJ)
  return resultOfDivide
})

失败到底是什么?您是否收到错误消息?不是预期的结果?对于顺序异步操作,您真正想要的是使它们都能按承诺工作,然后使用
wait
。逻辑流和错误处理的编码将变得越来越简单,这就是Javascript异步编码的现状和未来。@Bergi抱歉,我将用errorYes更新帖子,这是实现目标的更简单的方法。这就是重点。这就是它被发明的原因。相信我-你真的不想尝试用回调来协调多个异步操作。你的错误处理本身就是一场噩梦。这就是为什么承诺和
async/await
都被发明的原因。当我遇到一个不支持承诺的异步操作或库时,我会立即做出承诺(或切换到一个支持承诺的替代方案),并且只使用承诺编写异步代码。
squareRootOfSquare
需要两个参数,但您用一个参数调用它。