js,没弄明白 变量的作用域,我拿不到 res

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没变

解决方法:

  1. 把想在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
          }
          })
        }

  1. 利用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;
        }
    });
}