在自定义序列化函数中转换 base64



我有自定义序列化函数: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));

相关内容

  • 没有找到相关文章

最新更新