如何解决jQuery Ajax函数返回值无法存入变量的问题?
解决generate_code()返回undefined的问题
我明白你遇到的困扰了——调用generate_code()后,Random变量总是undefined,这都是因为函数里的AJAX请求是异步操作,直接同步调用根本拿不到最终的有效条码值。
问题根源拆解
- 你的
generate_code()函数当前返回的是$.ajax()的返回对象(一个jqXHR实例),而不是你真正想要的有效条码。 - AJAX请求会在后台执行,
success回调要等服务器响应后才会触发,这时候函数早就已经执行完返回了,回调里的return code完全没办法传递给外部的Random变量。
修改方案:用Promise处理异步逻辑
咱们把异步请求包装成Promise,这样就能优雅地获取到最终的有效条码了。
1. 重构check_barcode函数,返回Promise
function check_barcode(code) { var data = { Code: code }; var formsubmission = 'https://www.vsss.co.in/Admin/index.php/Ajax/check_barcode'; return new Promise((resolve, reject) => { $.ajax({ method: "POST", url: formsubmission, data: data, success: function(response) { var data = JSON.parse(response); // 如果条码已存在或已失效,重新生成并递归检查 if (data['Existing'] >= 1 || data['Disconnected'] >= 1) { resolve(generate_code()); } else { // 条码有效,返回这个值 resolve(code); } }, error: function(xhr) { // 处理请求失败的情况,可根据需求调整 reject('条码检查请求失败:', xhr); } }); }); }
2. 调整generate_code函数,返回Promise结果
function generate_code() { // 生成12位随机数 var randomCode = Math.floor(Math.random() * (999999999999 - 100000000000 + 1)) + 100000000000; // 把检查条码的Promise返回出去 return check_barcode(randomCode); }
3. 获取有效条码的两种方式
你可以选择以下任意一种方式拿到最终的有效条码:
方式一:用async/await(更直观的同步风格)
// 必须在async函数内使用await async function getValidBarcode() { try { var Random = await generate_code(); console.log('有效条码:', Random); // 这里可以把Random用于后续逻辑 } catch (error) { console.error('出错了:', error); } } // 调用函数触发流程 getValidBarcode();
方式二:用.then()链式调用
generate_code() .then(function(validCode) { var Random = validCode; console.log('有效条码:', Random); // 后续逻辑写在这里 }) .catch(function(error) { console.error('出错了:', error); });
为什么这样改能解决问题
- Promise是处理异步操作的标准方案,它能帮我们把“回调地狱”转换成清晰的链式或同步风格代码。
- 当生成的条码无效时,我们递归调用
generate_code()并把它的结果resolve出去,这样就能自动循环生成,直到拿到符合要求的有效条码。 - 用
await或.then()可以确保我们在异步请求完成后,再拿到最终的有效条码值,而不是提前拿到undefined。
内容的提问来源于stack exchange,提问作者shah rushabh
相关产品推荐
相关产品推荐

