簡體   English   中英

Javascript如何在觸發下一個函數之前正確等待一個函數?

[英]Javascript how to properly await for a function before triggering the next one?

我遇到了 await 和 async 函數的問題,其中應該等待獲取命令完成的函數在完成之前觸發,因此我收到未定義的值錯誤。

這是執行 fetch 的函數:

async function BoardGet() {

        let conjunction = "Bearer " + responseToken.response.token 

        var myHeaders = new Headers()
        myHeaders.append("Authorization", conjunction)
        myHeaders.append("Content-Type", "application/json")

        var raw = JSON.stringify({})

        var requestOptions = {
            method: 'GET',
            headers: myHeaders,
            //body: raw,
            redirect: 'follow'
        }

        fetch("https://link-to-my-database", requestOptions)
            .then(response => response.text())
            .then(function(result) {
                let tempAvailableBoards = result
                availableBoards = JSON.parse(tempAvailableBoards)
                console.log("available boards: ", availableBoards)
            })
            .catch(error => console.log('error', error))

只獲取一個 JSON 文件,該文件被解析為一個變量。 問題是當我調用使用availableBoards 的第二個函數時,即使我使用了 await,根據我的理解,這應該強制下一個代碼塊等待,但不會

async function BoardCheck() {

        await BoardGet()

        //check for board before creating a new one, if board already created return
        for(i = 0; i < availableBoards.response.data.length; i++) {
            if(boardId == availableBoards.response.data[i].fieldData._id_Miro_MiroBOARD) {
                console.log("This board is already in the database, now exiting this board create....")
                recordId = availableBoards.response.data[i].recordId // denotes filemaker data id for easier access (1 less loop)
                return
            }
            else if(i == availableBoards.response.data.length) {
                console.log("Borad not found, creating it...")
                BoardCreate()
            }
        }
    }

我收到此錯誤: Uncaught (in promise) TypeError: Cannot read property 'response' of undefined at BoardCheck 錯誤發生后,我從 BoardGet 得到響應,根據該等待判斷,代碼實際上並沒有等待

我是否以錯誤的方式使用等待?

您不會從BoardGet函數返回可以awaitPromise 在函數內部調用fetch()之前寫入return

async function BoardGet() {

   // ...

   // return the promise
   return fetch("https://link-to-my-database", requestOptions)
            .then(response => response.text())
            .then(function(result) {
                let tempAvailableBoards = result
                availableBoards = JSON.parse(tempAvailableBoards)
                console.log("available boards: ", availableBoards)
            })
            .catch(error => console.log('error', error))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM