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