Promise.all中的.then未等其中的promise执行完成而执行

下面的uploading函数为封装成Promise的上传表单的函数:

 function uploading(type,opts,serverurl,callback) {
            return new Promise(function (resolve,reject) {
                var formdata = new  FormData();
                formdata.append(type,JSON.stringify(opts));
                $.ajax({
                    type: 'post',
                    url: serverurl,
                    data: formdata,
                    cache : false,
                    processData : false, // 不处理发送的数据,因为data值是Formdata对象,不需要对数据做处理
                    contentType : false, // 不设置Content-type请求头
                    success: function (data,success) {
                        callback&&callback(JSON.parse(data));
                        console.log("look here")
                        console.log(data);
                        resolve(data)
                    },
                    error: function (err) {
                        reject(err);
                        alert("网络错误");
                    }
                })
            })
        }

主要代码从下面开始:
与该问题相关的代码逻辑主要为:(chunksarrpromise为调用uploading函数生成的Promise对象生成的数组,Promise.all(chunksarrpromise).then(values) => {} ,等待所有的文件块处理完成后执行对应的操作,现在的问题是,上面的Promise.all(chunksarrpromise).then中的values输出一直为空数组,而里面的每一个promise执行完确实是有返回的。)

       var chunksarrpromise =  new Array();
                        for(let curindex = 0;curindex < chunks;curindex++) {
                            if(file.size-start <= chunkSize) {
                                end = file.size;
                            }else {
                                end = start + chunkSize;
                            }
                            //仅上传未上传的部分
                            if(!isinArray(alreadychunks,curindex)) {
                                let tempcell = {
                                    data: null,
                                    n: 0,
                                    file_id: summary,
                                    username: username,
                                    length: 0
                                };
                                tempcell.length = end - start;
                                filder[curindex] = new FileReader();
                                filder[curindex].readAsText(file.slice(start, end),"gb2312");

                                filder[curindex].onload = function () {
                                    tempcell.n = curindex;
                                    tempcell.data = filder[curindex].result;
                                    console.log(tempcell)
                                    //chunk块上传
                                   chunksarrpromise.push(uploading("chunks", tempcell, chunksurl));
                                }
                            }
                            start = end;
                        }
                        console.log(chunksarrpromise);
                        Promise.all(chunksarrpromise).then((values) => {
                            console.log("Promise %%%%  all")
                            console.log(values);
                        }).catch(err => {
                            console.log(err);
                        })

代码执行结果如下:
(第一个look here是因为我上面还有个调用uploading的函数,真正的Promise.add是从Promise %%% all 开始的,可以看到它打出来的是[],而其Promise真正执行完后的data是mochen,也就是说Promise.all并未等其内部的Promise执行完就执行了,请问各位码友有碰到过吗?要怎么解决?)
代码地址: https://github.com/guangying1...
图片描述

阅读 7.5k
1 个回答

你的chunksarrpromise 是个空数组。。。,Promise.all就直接执行完了,因为你是通过异步函数往chunksarrpromise塞进去的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题