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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    promise.all.then() 后如何resolve 数组data
    19
    0

    问题描述

    promise.all(promises);promises是一个请求数组,希望请求完后可以resolve数据,但是并没有成功。

    问题出现的环境背景

    首页有5个get请求,axios超时拦截显示一个div,点击重新发起请求,但是前台页面接收到只有最后一个请求的response,所以我把请求放在一个数组里了,用promise.all发起,但是无法resolve数据

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    import Axios from 'axios'
    import Qs from 'qs'
    import Vue from 'vue'
    Axios.defaults.timeout = 500
    var configArr=[]
    const request = (options) => new Promise((resolve, reject) => {
        const page404 = (config) => {
            var Arr = [config];
            if(configArr.length>0){
                if(Arr.indexOf(configArr)<0){
                    configArr.push(config);
                }
            }else{
                configArr.push(config);
            }
            var configarr=[];
            for(var i=0;i<configArr.length;i++){
                if(configarr.indexOf(configArr[i])<0){
                    configarr.push(configArr[i]);
                }
            }
            document.getElementById('loadAgain').style.display='block';
            let c = Vue.extend({
            template:'<div id="loadAgain" @click="loadAgain"><div class="loadBox"><img src="static/img/woply_404@2x.png"/></div><p class="load-p">网络不给力</p><p class="load-p">点击屏幕,重新加载</p></div>',
                 methods: {
                    loadAgain() {
                        configArr=[];
                            let promises=[];
                            let result=[];
                            for(let i=0;i<configarr.length;i++){
                                promises.push(new Promise((resolve1, reject1) =>{
                                    return request(configarr[i]).then((res) => {
                                      if (typeof res == 'string') {
                                        res = JSON.parse(res)
                                      }
                                      result.push(res);
                                      resolve1(res);
                                    })
                                    .catch((err) => {
                                    })
                                    resolve1(result)
                                }))
                            }
                            Promise.all(promises).then(resultArray => {
                                console.log(result);
                                console.log(resultArray);
                                resolve(resultArray)
                            })
                            result=[];
                            configarr=[]
                        document.getElementById('loadAgain').style.display='none';
    
                    }
                }
            })
             new c().$mount('#loadAgain');
         }
     
         Axios.interceptors.response.use((response) => {
            //卸载404组件
            document.getElementById('loadAgain').style.display='none';
            return response;
         }, (error) => {
            let config=error.config;
            if(error.code=='ECONNABORTED'&& error.message.indexOf('timeout')!=-1){
                //超时处理
                document.getElementById('loadAgain').style.display='block';
                page404(config);
            }
            if(error.message.indexOf('Network')!=-1){
                 //网络异常
                 setTimeout(function(){
                    page404(config);
                 },5000)
            }
            return Promise.reject(error);
         });
    
        Axios.request(options)
        .then((res) => {
          if (typeof res == 'string') {
            res = JSON.parse(res)
          }
          resolve(res)
        })
        .catch((err) => {
        })
    })
    
    export default {
        get: (URL,options) => new Promise((resolve, reject) => {
            return request(Object.assign({}, options, { method: "get" ,url:URL})).then(res => {resolve(res)})
        }),
        post: (URL,params,options) => new Promise((resolve, reject) => {
            return request(Object.assign({}, options, { 
              method: "post",
              url:URL,
              headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
              },
              data:params,
              paramsSerializer: function(params) {
                return Qs.stringify(params, {arrayFormat: 'brackets'})
              },
            })).then(res => {resolve(res)})
        })
    }

    你期待的结果是什么?实际看到的错误信息又是什么?

    resolve后首页的请求可以拿到response,但是并没有到那里

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 浪荡一生钟情一人 普通会员 1楼

      Promise.all() 方法的回调函数中,then() 方法用于处理每个任务的完成或失败,resolve() 方法用于处理所有任务都成功完成的情况。下面是一个示例,展示如何在 Promise.all() 方法的回调函数中使用 resolve() 方法来处理数组 data

      ```javascript const promises = [ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3), Promise.resolve(4), Promise.resolve(5) ];

      Promise.all(promises) .then(data => { // 处理所有任务完成的情况 console.log(data); // 输出:[1, 2, 3, 4, 5] // resolve('All tasks completed') // 处理所有任务都成功完成的情况 resolve('All tasks completed'); }) .catch(error => { // 处理任务失败的情况 console.error(error); // 输出:错误:all promises rejected }); ```

      在这个示例中,Promise.all(promises) 是一个 Promise 对象,包含多个 Promise 对象。每个 Promise 对象代表一个任务,当所有任务都成功完成时,Promise.all() 方法会返回一个包含所有任务结果的 Promise 对象。

      then() 方法接受一个回调函数,该函数在每个任务完成时被调用。在这个回调函数中,我们可以访问并处理数组 data 中的每个元素。

      在这个示例中,resolve('All tasks completed') 是一个 resolve() 方法,它会返回一个新的 Promise 对象,该对象的 resolve() 方法被调用,当所有任务都成功完成时,该方法会调用 Promise.all() 方法返回的 Promise 对象的 resolve() 方法,从而将 data 字符串设置为 'All tasks completed'。

      注意,当一个或多个 Promise 失败时,catch() 方法会被调用,该方法会接收一个包含错误信息的 error 参数。在这个示例中,我们捕获了 Promise.all() 方法返回的错误,然后将错误信息打印到控制台。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部