【问题标题】:Asynchronous execution order of multiple function each one depending on the last one多个函数的异步执行顺序,每个函数取决于最后一个
【发布时间】:2021-08-15 05:37:39
【问题描述】:

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

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

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



【问题讨论】:

  • 到底是什么失败了?您是否收到错误消息?不是预期的结果?
  • 你真正想要的顺序异步操作是让它们都与promise一起工作,然后使用await。逻辑流和错误处理的编码最终会变得非常简单,这就是 Javascript 中异步编码的现在和未来。
  • @Bergi 抱歉,我会用错误更新帖子
  • 是的,实现目标的更简单方法。这就是重点。这就是它被发明的原因。相信我——你真的不想尝试通过回调来协调多个异步操作。仅您的错误处理就是一场噩梦。这就是promises 和async/await 都被发明的原因。当我遇到不支持 Promise 的异步操作或库时,我会立即对其进行 Promisify(或切换到支持 Promise 的替代方案),并且只使用 Promise 编写异步代码。
  • squareRootOfSquare 需要两个参数,但你用一个来调用它。

标签: javascript node.js asynchronous callback


【解决方案1】:

正如提到的 jfriend00 尝试使用承诺重写它。是的,对于串行计算,它更容易和更清晰。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多