我有自定义序列化函数:name is serializeForm()。我在其中有开关大小写来检查数据类型并根据类型转换值,然后发送 json 对象。
serializeForm: function (form , includeEmpty) {
var inputs = form.find('input,select,textarea');
var object = {};
if (!inputs.length) {
return null;
}
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
var name = input.getAttribute('name');
var value = input.value;
var type = input.dataset.type;
switch (type) {
case "text":
value = input.value;
break;
case "multiline":
value = JSON.stringify(input.value).replace(/"/g, "");
break;
case "list":
value = input.value.split(',').filter(Boolean);
break;
case "file":
var file = App.Utils.getBase64(input.files[0]);
file.then(function (data) {
console.log(data);
//value = data;
});
break;
case "date":
value= input.value ? moment.utc(input.value).format('YYYY-MM-DDThh:mm:ss.SSSZ') : null;
break;
default:
value = input.value;
break;
}
if (includeEmpty || (!includeEmpty && value !== "" && value !== null && value.length !== 0)) {
object[name] = value;
}
}
return object;
},
注意:在上面的函数中,在"文件"的情况下,我使用以下函数获取数据,该函数工作正常。
getBase64 : function(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
},
问题:在"文件"的情况下,在"数据"中获取base64值,即 console.log(data);
但是当我试图将数据转化为价值时,即 //value = data;
,它不起作用。因为当我初始化var value = input.value;
它时,它需要输入值而不是数据。
我认为这将由 promiseall() 解决,但我不知道如何将这段代码转换为 promiseall() 或任何其他方式。
请建议 .提前谢谢你。
Promise
是异步的。serializeForm
的当前实现是同步的。您可以使用async/await
和链.then()
来serializeForm()
函数。另请注意,值应该从 .then()
return
以获取后续链接.then()
的值,请参阅为什么在 .then() 处未定义值链接到 Promise?
async function serilizeForm(form , includeEmpty) {
switch(type) {
..
case "file":
value = await App.Utils.getBase64(input.files[0]); break;
..
}
return value;
}
serializeForm(inputA, inputB)
.then(data => console.log(data));