我有一個文章功能
一個表單中是用以下去給 ajax
formData = new FormData($('#form')[0]);
ajax
type: "POST",
url: "url",
data: formData,
enctype: "multipart/form-data",
cache: false,
contentType: false,
processData: false,
用這樣的方式丟到後端去(PHP)
表單中有 file 照片上傳跟一般 input
只是我找了一個編輯器
他 output 的格式是 json 像這樣
{
"time":1564653497717,
"blocks":[
{
"type":"paragraph",
"data":{
"text":"serhsrehehserhesh"
}
}
],
"version":"2.15.0"
}
於是就有一個問題
我如何將這個 json 丟到後端去?
我的做法是
formData = new FormData($('#form')[0]);
editor.save().then((outputData) => {
console.log(JSON.stringify(outputData));
formData.append('outputData', JSON.stringify(outputData));
});
後端接收
foreach (json_decode($_POST['outputData'], true) as $key) {
echo $key['time']; // 抓抓看他的 time
}
但會出現 Invalid argument supplied for foreach()
錯誤,$_POST['outputData']
在 foreach 抓不到值,等於是沒過去後端⋯⋯
把 json string 丟到 formData 其中一個 field 但不行
這⋯⋯能怎麼解呢
萬分感謝思路!
front
<script>
$('#btn').click(() => {
const outputData = {
"time": 1564653497717,
"blocks": [
{
"type": "paragraph",
"data": {
"text": "serhsrehehserhesh"
}
}
],
"version": "2.15.0"
};
const myFormData = new FormData();
myFormData.append('outputData', JSON.stringify(outputData));
$.ajax({
url: 'back.php',
type: 'post',
data: myFormData,
enctype: "multipart/form-data",
cache: false,
contentType: false,
processData: false,
success() {
},
fail() {
}
})
});
</script>
back
<?php
if (isset($_POST['outputData'])) {
$dataFormat = json_decode($_POST['outputData'], true);
print($dataFormat['time']);
// output 1564653497717
}
?>
只需要看 main 的部分
在最外層 的 function 加上 async
然後 outputdata 那改成
outputData = await editor.save()
.then(data => data)
.catch(err => console.log(err));
我要取編輯器的值,他是這樣獲取
editor.save().then((outputData) => {
console.log(JSON.stringify(outputData));
});
但我原本做法不行
formData = new FormData($('#form')[0]);
editor.save().then((outputData) => {
console.log(JSON.stringify(outputData));
formData.append('outputData', JSON.stringify(outputData)); // 這段不行,這段需要在外面
});
於是我試試看這樣
formData = new FormData($('#form')[0]);
editor.save().then((outputData) => {
console.log(JSON.stringify(outputData));
});
formData.append('outputData', '1');
這樣確實後端就可以取 1
表示真的不能在裡面⋯⋯
也就是說我要把 outputData
拿出來用
但我稍微試了一下全域用法
var haha;
editor.save().then((outputData) => {
console.log(JSON.stringify(outputData));
haha = '123';
});
console.log(haha);
得到 undefined⋯⋯
因為他是回傳 promise
所以不能這樣做
我補個 codepen 範例
應該是 Promise 的關係⋯⋯
嗯我剛看了一下確實是 Promise 異步
果真需要用 await
有 .then .catch .finally
87% 是 promise
有辦法在裡面用 function callback 嗎
.then(data => data)
這一段是什麼意思?
變這樣可以取到值嗎?
https://imgur.com/JuOD7jm
.then(data => data)
等於
.then((data) => { return data })
你貼的圖
還是在傳 promise 物件阿
我是在 main 把 outputData return 然後印出 main()
這樣搞定了
const main = async() => {
outputData = await editor.save();
formData.append('outputData', JSON.stringify(outputData));
// 執行我要的東西
}
main();
感謝
印 main 沒有意義呀
我上面這做法是你原本希望的做法嗎?
是
這樣就能確保你 outputData 有東西
如果沒有 error 的話