我有一個文章功能
一個表單中是用以下去給 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 的話