我的 promise function 沒有正常運作, 請問是甚麼原因呢?
function getImages(imageArray){
return new Promise((resolve, reject) => {
let array = [1, 2, 3];
for (let i = 0; i < imageArray.length; i++) {
const reader = new FileReader();
reader.onload = function (e) {
const img = new Image();
img.onload = function(){
if(img.width === 960 && img.height === 960){
let imgSrc = e.target.result.split(",");
if(imgSrc[0].indexOf("png") > -1 || imgSrc[0].indexOf("jpg") > -1 || imgSrc[0].indexOf("jpeg") > -1){
const imageHTML = [];
imageHTML.push(`<input type='checkbox' class='imagecheckbox noM' id='imagecheckbox' onclick='checkit()' value="${i}">`);
array.push(imageHTML);
} else {
alert("只允許上傳JPG、或PNG影像檔");return;
}
}else{
alert("您所上傳圖片尺寸未符合規範");return;
}
}
img.src = e.target.result;
}
reader.readAsDataURL(imageArray[i]);
}
resolve(array);
});
getImages($("#imageUpload")[0].files)
.then((success) => {
console.log(success); // 這裡還是回傳空陣列
})
提供參考,大致上是:
function getImages(imageArray) {
/**
* 讀取檔案為 dataurl
* @param {File} file 檔案
* @returns {Promise.<string>} promise of dataurl
*/
function readAsDataUrl(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function (e) {
resolve(e.target.result);
}
reader.readAsDataURL(file);
});
}
function checkImage(dataurl) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = function () {
if (img.width === 960 && img.height === 960) {
let imgSrc = dataurl.split(",");
if (imgSrc[0].indexOf("png") > -1 || imgSrc[0].indexOf("jpg") > -1 || imgSrc[0].indexOf("jpeg") > -1) {
resolve(dataurl);
} else {
reject("只允許上傳JPG、或PNG影像檔");
}
} else {
reject("您所上傳圖片尺寸未符合規範");
}
}
img.onerror = function () {
reject("只允許上傳JPG、或PNG影像檔");
}
img.src = dataurl;
});
}
return Promise.all(Array.from(imageArray).map(x => readAsDataUrl(x).then(checkImage)));
}
$("#imageUpload").on('change', evt => {
getImages(evt.target.files)
.then((success) => {
console.log(success.map((dataurl, i) => {
return `<input type='checkbox' class='imagecheckbox noM' id='imagecheckbox' onclick='checkit()' value="${i}">`;
}));
}).catch(error => {
alert(error);
});
});
淺水員成功了~~ 感謝.
所以原本的程式問題出在我把 讀取檔案、讀取圖檔 都寫在同一個promise裡面嗎?
每個異步步驟包成一個 Promise 只是我習慣的做法
要寫成一個也是可以
你原先的問題主要是用迴圈處理 Promise 的部分
下面這寫法比較像你原本的,提供參考
async function getImages(imageArray) {
let array = [];
for (let i = 0; i < imageArray.length; i++) {
let imageHTML = await new Promise((resolve, reject) => {
const html = `<input type='checkbox' class='imagecheckbox noM' id='imagecheckbox' onclick='checkit()' value="${i}">`;
const reader = new FileReader();
reader.onload = function (e) {
const img = new Image();
img.onload = function () {
if (img.width === 960 && img.height === 960) {
let imgSrc = e.target.result.split(",");
if (imgSrc[0].indexOf("png") > -1 || imgSrc[0].indexOf("jpg") > -1 || imgSrc[0].indexOf("jpeg") > -1) {
resolve(html);
} else {
reject("只允許上傳JPG、或PNG影像檔");
}
} else {
reject("您所上傳圖片尺寸未符合規範");
}
}
img.onerror = function() {
reject("只允許上傳JPG、或PNG影像檔");
}
img.src = e.target.result;
}
reader.readAsDataURL(imageArray[i]);
});
array.push(imageHTML);
};
return array;
}
$("#imageUpload").on('change', evt => {
getImages(evt.target.files)
.then((success) => {
console.log(success);
}).catch(error => {
alert(error);
});
});
昨天忘記說,上傳多張圖片時,imageHtml 的 id 會重複
這問題你再自己修一下吧
請善用 F12 大法。查看您的錯誤訊息。
而且 FileReader 元件是需要特定情況下使用的。
從你目前的程式碼來看,感覺並不是很正規的使用方式。
但因為還不太清楚您傳進來的imageArray值是什麼。
所以沒辦法判斷。
如果你傳進來的值是自已定義的檔案路徑。
那就一定是不能使用的。
其它詳細就請其它大大們補充