js,没弄明白 变量的作用域,我拿不到 res
问题描述:
js,没弄明白 变量的作用域,我拿不到 res, 有什么办法 让repeatData 拿到 res
for(let i=0; i<modData.repeatField.length;i++){
var repeatData = [1,2] //定义变量
const params ={ [modData.repeatField[i]]: row[modData.repeatField[i]]}
getMethod(modData.url, params).then(res=>{
repeatData = res // 给 repeatData 赋值
console.log('后端检查重复校验4', repeatData) //这个 repeatData 是 res
})
console.log('后端检查重复校验5', repeatData) // 这个 repeatData 始终是 [1,2],我是要的是res,
if (repeatData.length >=1){
errMessage(row[modData.repeatField[i]] + ',服务器已存在此项目,请勿重复添加!','提示')
return
}
}
答
因为请求是异步的,请求在过程中会继续执行下面代码,所以你在请求外输出repeatData没变
解决方法:
- 把想在repeatData赋值后的操作放在请求的then(res =>{)里,这样就能确保请求完再执行赋值等操作
for(let i=0; i<modData.repeatField.length;i++){
var repeatData = [1,2] //定义变量
const params ={ [modData.repeatField[i]]: row[modData.repeatField[i]]}
getMethod(modData.url, params).then(res=>{
repeatData = res // 给 repeatData 赋值
console.log('后端检查重复校验4', repeatData) //这个 repeatData 是 res
console.log('后端检查重复校验5', repeatData) // 这个 repeatData 始终是 [1,2],我是要的是res,
if (repeatData.length >=1){
errMessage(row[modData.repeatField[i]] + ',服务器已存在此项目,请勿重复添加!','提示')
return
}
})
}
- 利用es6 async await的语法糖,把请求的异步过程写成同步写法,就能一步一步执行了,但是这样就不能捕获异常了,所以要用try catch结构包裹请求捕获异常
async test(){
try{
for(let i=0; i<modData.repeatField.length;i++){
var repeatData = [1,2] //定义变量
const params ={ [modData.repeatField[i]]: row[modData.repeatField[i]]}
let res = await getMethod(modData.url, params)
repeatData = res // 给 repeatData 赋值
console.log('后端检查重复校验4', repeatData) //这个 repeatData 是 res
console.log('后端检查重复校验5', repeatData) // 这个 repeatData 始终是 [1,2],我是要的是res,
if (repeatData.length >=1){
errMessage(row[modData.repeatField[i]] + ',服务器已存在此项目,请勿重复添加!','提示')
return
}
}
}catch{
console.log('err')
}
}
如有帮助,麻烦点个[采纳此答案]^O^
答
可以尝试使用Object.assign来赋值,还有你的getMethod是异步请求吧,会先执行判断在运行then里面的内容吧
答
if (repeatData.length >=1){
errMessage(row[modData.repeatField[i]] + ',服务器已存在此项目,请勿重复添加!','提示')
return
}
放到repeatData = res赋值的后面
答
不确定你这个res有没有值。你可以把判断写在有值的地方,如果返回值的长度小于0提示报错,否则就成功,然后取值复制,后面可以异常处理
答
接口是异步代码,异步的操作代表你接口发送出去了,但是还没有返回的之后,就执行了下面的 console.log("后端检查重复校验5", repeatData);以及以下代码,所以如果只是打印,就一定是[1,2],想要改就得把你同步的代码放进异步完成后的代码里,或者使用async/await来达到同步的效果
for (let i = 0; i < modData.repeatField.length; i++) {
var repeatData = [1, 2]; //定义变量
const params = { [modData.repeatField[i]]: row[modData.repeatField[i]] };
// ----------start 从这里开始是异步,也就代表你接口发送出去了,但是还没有范湖IDE时候,就执行下面的校验5那个打印了 ----------
getMethod(modData.url, params).then((res) => {
repeatData = res; // 给 repeatData 赋值
console.log("后端检查重复校验4", repeatData); //这个 repeatData 是 res
console.log("后端检查重复校验5", repeatData); // 如果你要使用这个res,必须将代码放在异步里面,或者使用async/await
if (repeatData.length >= 1) {
errMessage(
row[modData.repeatField[i]] +
",服务器已存在此项目,请勿重复添加!",
"提示"
);
return;
}
});
}