在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML5  HTML  Office/ Promise.all中的.then未等其中的promise執(zhí)行完成而執(zhí)行

Promise.all中的.then未等其中的promise執(zhí)行完成而執(zhí)行

下面的uploading函數(shù)為封裝成Promise的上傳表單的函數(shù):

 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, // 不處理發(fā)送的數(shù)據(jù),因?yàn)閐ata值是Formdata對(duì)象,不需要對(duì)數(shù)據(jù)做處理
                    contentType : false, // 不設(shè)置Content-type請(qǐng)求頭
                    success: function (data,success) {
                        callback&&callback(JSON.parse(data));
                        console.log("look here")
                        console.log(data);
                        resolve(data)
                    },
                    error: function (err) {
                        reject(err);
                        alert("網(wǎng)絡(luò)錯(cuò)誤");
                    }
                })
            })
        }

主要代碼從下面開(kāi)始:
與該問(wèn)題相關(guān)的代碼邏輯主要為:(chunksarrpromise為調(diào)用uploading函數(shù)生成的Promise對(duì)象生成的數(shù)組,Promise.all(chunksarrpromise).then(values) => {} ,等待所有的文件塊處理完成后執(zhí)行對(duì)應(yīng)的操作,現(xiàn)在的問(wèn)題是,上面的Promise.all(chunksarrpromise).then中的values輸出一直為空數(shù)組,而里面的每一個(gè)promise執(zhí)行完確實(shí)是有返回的。)

       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);
                        })

代碼執(zhí)行結(jié)果如下:
(第一個(gè)look here是因?yàn)槲疑厦孢€有個(gè)調(diào)用uploading的函數(shù),真正的Promise.add是從Promise %%% all 開(kāi)始的,可以看到它打出來(lái)的是[],而其Promise真正執(zhí)行完后的data是mochen,也就是說(shuō)Promise.all并未等其內(nèi)部的Promise執(zhí)行完就執(zhí)行了,請(qǐng)問(wèn)各位碼友有碰到過(guò)嗎?要怎么解決?)
代碼地址: https://github.com/guangying1...
圖片描述

回答
編輯回答
短嘆

你的chunksarrpromise 是個(gè)空數(shù)組。。。,Promise.all就直接執(zhí)行完了,因?yàn)槟闶峭ㄟ^(guò)異步函數(shù)往chunksarrpromise塞進(jìn)去的

2017年3月19日 05:19