为什么 response.json() 返回一个承诺?

时间:2021-04-11 10:01:09

标签: javascript php json

我有这个 JavaScript 提取函数

async getAllExpensesByUser() {
    let reponse = await fetch("router.php/getAll");
    console.log(reponse.json());
  }

也试过了

getAllExpensesByUser = async () => {
    const response = await fetch("router.php/getAll");
    if (response.ok) {
      const jsonValue = await response.json();
      return Promise.resolve(jsonValue);
    } else {
      return Promise.reject("*** PHP file not found");
    }
  };

我的 router.php 文件有这个代码

   $data = $expensesController->getExpensesForUser($_SESSION['userid']);
   echo json_encode($data);

response.json() 返回 Promise {<pending>} 而我需要的结果在 [[PromiseResult]]

2 个答案:

答案 0 :(得分:1)

正如 Yousaf 所指出的,fetch 和 Body.json() 都返回 promise。要在继续之前等待 fetch 和 Body.json 调用解析,您只需像这样更新代码:

    //Encode the data
       postBody, _ := json.Marshal(map[string]string{
          "name":  "Test",
          "email": "Test@Test.com",
       })
       responseBody := bytes.NewBuffer(postBody)
    //Leverage Go's HTTP Post function to make request
       resp, err := http.Post("https://postman-echo.com/post", "application/json", responseBody)
    //Handle Error
       if err != nil {
          log.Fatalf("An Error Occured %v", err)
       }
       defer resp.Body.Close()
    //Read the response body
       body, err := ioutil.ReadAll(resp.Body)
       if err != nil {
          log.Fatalln(err)
       }
       sb := string(body)
       log.Printf(sb)

答案 1 :(得分:1)

response.json() 返回一个 Promise,因为这个方法需要一个 Response stream 并读取它直到完成,这是一个异步过程。您可以在 specification

中找到有关它的更多信息

您只需要等待读取流的过程结束,为此您也可以使用 await

async getAllExpensesByUser() {
  let reponse = await fetch("router.php/getAll");
  let object = await response.json();
  return object
}

...

const userExpenses = await getAllExpensesByUser()
console.log(userExpenses) 

...