微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我想创建一个依赖于最后一个结果的函数序列。第一个函数将从数据库中导入数据。

导入值> fctOne(Value) > fctTwo(fctOne(Value)的值) > fctThree(fctTwo(value)的值) >等等...

App.js 需要等待值被导入,所以 fctOne 不能同步。但是,我背后的所有功能是否也需要异步?他们必须按顺序运行。

我的失败代码:有错误:“callBack(result) TypeError: callBack is not a function”

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
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。