gpt4 book ai didi

javascript - Node.js + Express - 在完成之前返回未定义的回调

转载 作者:搜寻专家 更新时间:2023-10-31 23:41:28 24 4
gpt4 key购买 nike

所以我在这方面遇到了真正的麻烦 - 已经坚持了几个星期。

我的第一个函数查询 MySQL 数据库并返回一个响应,然后在我的第二个函数中进行处理。

问题是 JS 是单线程的,我不知道如何让它按我想要的顺序运行:

  1. 函数 1 被触发。
  2. 该函数获取数据库响应,然后进行处理。
  3. 响应被传递给函数 2,函数 2 然后进行更多处理。

但是此时,程序直接跳转到函数二,没有时间进行查询,函数最终返回“undefined”。

var test = functionOne (functionTwo);   
console.log(test); //returning 'undefined'

function functionOne(callback) {
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(null, result);
});
}

function functionTwo(err, result) {
//More processing - slightly slow
return result;
}

编辑:

这是完整的文件。

    var client = require('./dbHelper');
var convert = require('./genGIF');
var exportPPM = require('./makePPM');
var fs = require('fs');

module.exports = function() {
var test = queryDatabase (handleResult);
console.log("print: " + test);
}

function queryDatabase(callback) {
//Query our database
client.query("SHOW TABLES FROM mathsDB", function(err, result) {
if (err) {
callback(err);
}

else {
//Calculate the length of our table and then the last image in the table
var currentImage = result[result.length - 1]["Tables_in_mathsDB"];
currentImage = currentImage.substring(5);
callback(null, currentImage);
console.log(currentImage);
}
});
}

function handleResult(err, currentImage) {
fs.stat("./img/image" + currentImage + ".gif", function(err, stat) {
if (err==null) {
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
//Check if we have a .PPM file made for the image instead, then generate a .GIF
fs.stat("./img/image" + currentImage + ".ppm", function(err, stat) {
if (err==null) {
convert.convert("image" + currentImage);
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}

else {
//Generate the .GIF if no .GIF or .PPM already.
exportPPM.make();
convert.convert("image" + currentImage);
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
});
}
});
}

最佳答案

您将结果作为回调的第一个参数返回,但它应该是第二个参数 - 换句话说,您正在用结果填充 err 参数,因此参数 result 将始终为 undefined

所以改变:

function functionOne(callback) {  
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(result);
});
}

对此:

function functionOne(callback) {  
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(null, result); // pass it as the second argument
});
}

这应该可以解决您的问题。

关于javascript - Node.js + Express - 在完成之前返回未定义的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com