candyl6 发表于 2021-3-16 19:42

求JS大神帮看看代码

import dept from './dt.js'
import pat from './pt.js'

async function getSelectDt(uid) {
      const deptArr = await dept.getDept(uid);//获取原始json数组
      let fiArr = deptArr.filter(item => item.Dept_Type == '1');//过滤一遍生成新的数组
      let tmp = [];
      fiArr.map(async n => {
                let m = await pat.getPat(n.Dept_Code)//getPat返回的是一个Promise
                let j = {
                        "Dept_Code": n.Dept_Code,
                        "Dept_Type": n.Dept_Type,
                        "DEPT_NAME": n.DEPT_NAME,
                        "User_Id": n.User_Id,
                        "Item": m
                }
                tmp.push(j);
                console.log(tmp)//单次循环生成的新的数组是我想要的
      });
      console.log(tmp) //这里结果确实空的
}

export {
      getSelectDt
}

求大神帮忙看看,第18行的位置单次循环确实输出了我想要的结果,但是我怎么把最终的tmp数组给返回来呢,第20行输出的结果始终是空的,而且第20行的代码总是优先于第18行运行的
我尝试在第8行加上await ,但始终还是第20行先运行,求大神指导,跪谢

一条鱼尾 发表于 2021-3-16 19:42

js map,forEach等都是同步的
可以参考 https://blog.csdn.net/weixin_41602509/article/details/103494265
其实使用最简单的for循环就行

candyl6 发表于 2021-3-16 20:01

@独木君 @柒點貌似发错区了,请帮我搬到『编程语言区』

fanvalen 发表于 2021-3-16 20:06

虽然我怎么懂js 但是我看第八行有个=>这是判断吗
如果判断失败肯定直接运行下一句了

独木君 发表于 2021-3-16 20:08

已经移动了

candyl6 发表于 2021-3-16 20:47

fanvalen 发表于 2021-3-16 20:06
虽然我怎么懂js 但是我看第八行有个=>这是判断吗
如果判断失败肯定直接运行下一句了

这是map使用的参数,是一个函数,第18行是有输出的,证明里面是运行了的

咿呀哇 发表于 2021-3-16 20:48

import dept from './dt.js'
import pat from './pt.js'

async function getSelectDt(uid) {
      const deptArr = await dept.getDept(uid);//获取原始json数组
      let fiArr = deptArr.filter(item => item.Dept_Type == '1');//过滤一遍生成新的数组
      let tmp = [];
      await Promise.all(fiArr.map(async n => {
                let m = await pat.getPat(n.Dept_Code)//getPat返回的是一个Promise
                let j = {
                        "Dept_Code": n.Dept_Code,
                        "Dept_Type": n.Dept_Type,
                        "DEPT_NAME": n.DEPT_NAME,
                        "User_Id": n.User_Id,
                        "Item": m
                }
                tmp.push(j);
                console.log(tmp)//单次循环生成的新的数组是我想要的
      }));
      console.log(tmp) //这里结果确实空的
}

export {
      getSelectDt
}

52pojie11023995 发表于 2021-3-16 22:10

我说说我的思路吧:
在循环之前声明一个变量,变量指定一个值。
在第18行,判断这个变量是否为之前自己指定的值,如果是,就用这个变量记录你要的结果(这样可以保证是第一次循环的结果,而不是其他次的。),运行完20行后再返回就行了。

yuenc 发表于 2021-3-16 22:30

map后的返回值 await promise.all 一下

轩云呀 发表于 2021-3-17 10:16

本帖最后由 轩云呀 于 2021-3-17 10:18 编辑

import dept from './dt.js'
import pat from './pt.js'

async function getSelectDt(uid) {
      const deptArr = await dept.getDept(uid);//获取原始json数组
      let fiArr = deptArr.filter(item => item.Dept_Type == '1');//过滤一遍生成新的数组
      let tmp = [];
      await fiArr.map(async n => {
                let m = await pat.getPat(n.Dept_Code)//getPat返回的是一个Promise
                let j = {
                        "Dept_Code": n.Dept_Code,
                        "Dept_Type": n.Dept_Type,
                        "DEPT_NAME": n.DEPT_NAME,
                        "User_Id": n.User_Id,
                        "Item": m
                }
                tmp.push(j);
                console.log(tmp)//单次循环生成的新的数组是我想要的
      });
      console.log(tmp) //这里结果确实空的
}

export {
      getSelectDt
}


第八行也加个await
页: [1]
查看完整版本: 求JS大神帮看看代码