[英]What the execution order of asynchronous functions if there are multiple in one thread?
[英]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.