账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    for循环中的异步获取的问题
    • 2018-07-28 00:00
    • 10
    21
    -1

    我有如下的示例代码,但是resolve后得到是空,因为在for中使用了多个异步获取的函数,导致了最终获得的结果只有1条,各位大神出来帮忙给点意见,主要目的是学习Promise

    var arr1= [
            {id:1,name:'Jason', age: 23, content:'我是来学习的家伙'},
            {id:2,name:'Jason2', age: 23, content:'我是来学习的家伙'},
            {id:3,name:'Jason3', age: 23, content:'我是来学习的家伙'},
            {id:4,name:'Jason4', age: 23, content:'我是来学习的家伙'},
            {id:5,name:'Jason5', age: 23, content:'我是来学习的家伙'},
            {id:6,name:'Jason6', age: 23, content:'我是来学习的家伙'},
            {id:7,name:'Jason7', age: 23, content:'我是来学习的家伙'},
            {id:8,name:'Jason8', age: 23, content:'我是来学习的家伙'},
            {id:9,name:'Jason9', age: 23, content:'我是来学习的家伙'},
            {id:10,name:'Jason11', age: 23, content:'我是来学习的家伙'},
            {id:11,name:'Jason12', age: 23, content:'我是来学习的家伙'},
            {id:12,name:'Jason13', age: 23, content:'我是来学习的家伙'},
            {id:13,name:'Jason14', age: 23, content:'我是来学习的家伙'},
            {id:14,name:'Jason15', age: 23, content:'我是来学习的家伙'},
            {id:15,name:'Jason16', age: 23, content:'我是来学习的家伙'},
            {id:16,name:'Jason17', age: 23, content:'我是来学习的家伙'},
            {id:17,name:'Jason18', age: 23, content:'我是来学习的家伙'},
            {id:18,name:'Jason19', age: 23, content:'我是来学习的家伙'},
            {id:19,name:'Jason22', age: 23, content:'我是来学习的家伙'},
            {id:20,name:'Jason23', age: 23, content:'我是来学习的家伙'},
            {id:21,name:'Jason24', age: 23, content:'我是来学习的家伙'},
            {id:22,name:'Jason25', age: 23, content:'我是来学习的家伙'},
            {id:23,name:'Jason26', age: 23, content:'我是来学习的家伙'},
            {id:24,name:'Jason27', age: 23, content:'我是来学习的家伙'},
            {id:25,name:'Jason28', age: 23, content:'我是来学习的家伙'},
            {id:26,name:'Jason29', age: 23, content:'我是来学习的家伙'},
            {id:27,name:'Jason33', age: 23, content:'我是来学习的家伙'},
            {id:28,name:'Jason34', age: 23, content:'我是来学习的家伙'},
            {id:29,name:'Jason35', age: 23, content:'我是来学习的家伙'},
            {id:30,name:'Jason36', age: 23, content:'我是来学习的家伙'},
            {id:31,name:'Jason37', age: 23, content:'我是来学习的家伙'},
            {id:32,name:'Jason38', age: 23, content:'我是来学习的家伙'},
            {id:34,name:'Jason39', age: 23, content:'我是来学习的家伙'},
            {id:35,name:'Jason44', age: 23, content:'我是来学习的家伙'},
            {id:36,name:'Jason41', age: 23, content:'我是来学习的家伙'},
            {id:37,name:'Jason42', age: 23, content:'我是来学习的家伙'},
            {id:38,name:'Jason43', age: 23, content:'我是来学习的家伙'}
        ]
        var arr2 = [
            {class:'一年级2班', userId: 33},
            {class:'一年级3班', userId: 3},
            {class:'一年级2班', userId: 5},
            {class:'一年级6班', userId: 38},
            {class:'一年级2班', userId: 21},
            {class:'一年级3班', userId: 2},
            {class:'一年级2班', userId: 1},
            {class:'一年级9班', userId: 5},
            {class:'一年级2班', userId: 7},
            {class:'一年级1班', userId: 10},
            {class:'一年级2班', userId: 13},
            {class:'一年级5班', userId: 23}
        ]
        var arr3 = [
            {scope:80, userId: 21},
            {scope:50, userId: 5},
            {scope:70, userId: 10},
            {scope:20, userId: 23},
            {scope:70, userId: 13},
            {scope:44, userId: 3},
            {scope:23, userId: 33},
            {scope:76, userId: 1},
            {scope:45, userId: 10},
            {scope:26, userId: 38},
            {scope:65, userId: 7},
            {scope:45, userId: 30},
            {scope:76, userId: 22},
            {scope:46, userId: 4},
            {scope:95, userId: 8},
            {scope:100, userId: 9},
            {scope:74, userId: 35}
        ]
       //获取所以学生的名字和ID
       function getName() {
            return new Promise((resolve, reject) => {
                let cf = []
                arr1.map(item => {
                    cf.push({id: item.id,name:item.name})
                })
                resolve(cf)    
            })
        }
        //获取学生的分数
        function getScope(id) {
            return new Promise((resolve,reject) => {
                arr3.map(item=>{
                    if(id == item.userId){
                        resolve(item.scope)
                    }
                })
                
            })
        }
        function allPromise() {
        return new Promise((resolve, reject) => {
            let data = []
            getName().then(res => {
                console.log('res', res)
                let promise1 = []
                for (var i = 0; i < res.length; i++) {
    
                    let name = res[i].name
                    let id = res[i].id
                    let classes, scope
                    for (var j = 0; j < arr2.length; j++) {
                        if (arr2[j].userId == id) {
                            classes = arr2[j].class
                            getScope(id).then(result => {
                                scope = result
                                data.push({
                                    id: id,
                                    name: name,
                                    class: classes,
                                    scope: scope
                                })
                            })
                        }
                    }
                }
            })
            console.log(data)
            resolve(data)
        })
    }
    
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • -1
    • 放ジ荡〆 普通会员 1楼

      在for循环中,我们通常会使用同步获取的方式来获取数据,例如使用fetch()方法或XMLHttpRequest对象。然而,如果我们想要获取异步数据,我们可以使用回调函数、Promise或者async/await等方法。

      以下是一个使用Promise的例子:

      javascript for (let i = 0; i < 10; i++) { setTimeout(() => { const data = await fetch('https://api.example.com/data'); console.log(data); }, i * 1000); }

      在这个例子中,fetch()方法返回一个Promise,然后我们使用then()方法处理这个Promise。then()方法接受一个回调函数,这个回调函数会在Promise被解决或者被拒绝时被调用。

      如果你使用的是async/await,那么你可以这样做:

      ```javascript async function fetchData() { for (let i = 0; i < 10; i++) { const data = await fetch('https://api.example.com/data'); console.log(data); } }

      fetchData(); ```

      在这个例子中,fetchData()函数是一个async函数,它会立即开始执行。然后,我们使用await关键字等待fetchData()函数完成。一旦fetchData()函数完成,我们就调用console.log()来打印获取的数据。

      无论你使用哪种方法,都可以保证异步获取的数据不会阻塞整个for循环的执行。

    更多回答
    扫一扫访问手机版