【问题标题】:Uncaught TypeError: postData(...).then is not a function未捕获的 TypeError: postData(...).then 不是函数
【发布时间】:2019-01-09 20:33:41
【问题描述】:

我设置了一个按钮,单击该按钮将通过 fetch 发布数据并创建警报。但是,我首先检查以确保某些输入不为空。如果输入元素没有值,我会尝试返回一个字符串,告诉我哪个输入元素值为空。当我这样做时,会出现“Uncaught TypeError: postData(...).then is not a function”错误。我也看过Uncaught TypeError: $.get(...).then is not a function,但无法弄清楚。任何帮助将不胜感激。谢谢!

document.getElementById("sbmForm").onclick = function () {postData(`/projectInfo`)
    .then(result => alert(JSON.stringify(result))) // JSON-string from `response.json()` call
    .catch(error => alert(error))};



function postData(url = ``) {
    // get form data from local storage
    var data = {};
    var unqVal = document.getElementById("unq_num").innerHTML;
    unqVal = "--??**" + unqVal;

    // keys that can not be empty
    var notEmpty = ["comp_name", "compaddr_str_num", "compaddr_str_nam", "compaddr_city",
        "compaddr_state", "compaddr_zipcode", "proj_name", "projaddr_str_num", "projaddr_str_nam",
        "projaddr_city", "projaddr_state", "projaddr_zipcode", "contact_fname", "contact_date"];
    /* get all keys and values from local storage and store them in dict to send to server */
    var keys = Object.keys(localStorage);

    var i;
    for (i=0; i < keys.length; i++){

        var val = localStorage.getItem(keys[i]);

        // if unq val is in string, add it to the data
        var indexOf = keys[i].indexOf(unqVal);

        if (indexOf != -1){

            var keyNU = keys[i].substring(0, indexOf);
            // if value is in array
            if (notEmpty.includes(keyNU)){
                // if value is empty
                if (!val){
                    alert(keyNU + " cannot be empty!");

                    /**** ERROR OCCURS HERE *****/
                    return keyNU + " cannot be empty!";
                }
            }

            data[keys[i]] = val;
        }

    }

    // Default options are marked with *
    return fetch(url, {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
        },
        body: JSON.stringify(data), // body data type must match "Content-Type" header
    })
    .then(response => response.json()); // parses response to JSON
};

【问题讨论】:

    标签: javascript es6-promise


    【解决方案1】:

    当检测到“错误”时,您返回的是字符串值而不是 promisethen 方法只存在于 Promise 上。

    将您的 function 更改为 async,以便默认返回 promise

    async function postData(url = ``){}
    

    然后在需要发生的时候抛出一个错误(将被catch方法捕获)通过改变这个

    /**** ERROR OCCURS HERE *****/
    return keyNU + " cannot be empty!";
    

    throw new Error(keyNU + " cannot be empty!");
    

    最后,为您的获取:

    //fetch returns a promise, so use await
    const res = await fetch(url, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(data), // body data type must match "Content-Type" header
    });
    
    //res.json() returns a promise, so use await
    return await res.json();
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2019-09-15
      相关资源
      最近更新 更多