繁体   English   中英

多个function的异步执行顺序各取最后一个

[英]Asynchronous execution order of multiple function each one depending on the last one

我真的很难理解异步代码和回调 function。

我想制作一系列 function 取决于最后一个的结果。 第一个 function 将从数据库导入数据。

导入值 > 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
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM