Uncaught (in promise) undefined

  • 自定义的全局Http对象,专门来发异步请求。调用时执行reject操作报错:Uncaught (in promise) undefined
  • catch代码段,不论执行reject还是return Promise.reject();都是Uncaught (in promise)

报错信息如下:
图片描述

请求响应如下:
图片描述

关键代码如下:

  • http.js
/**
 * ------------------------------------------------------------------
 * 异步请求对象
 * ------------------------------------------------------------------
 */
import Const from './const'
import App from '../main'
import Common from './common'

class Http {
    constructor() {
        this.xmlhttp = new XMLHttpRequest();
    }

    post(url, data) {
        let params = [];
        for (let key in data) {
            params[params.length] = encodeURIComponent(key) + "=" + encodeURIComponent(data[key])
        }
        let postData = params.join('&').replace(/%20/g, "+");

        return new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest();

            xhr.open('post', url, true);
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

            //监听HTTP状态
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304)) {
                        
                        try {
                            let resp = JSON.parse(xhr.responseText);
                            if (resp.code == 200) {
                                if (resp.code == 401 || resp.code == 302) {
                                    if (resp.data === Const.NONE_USER) {
                                        //跳转到未授权页面
                                    } else if (resp.data === Const.UNKNOWN_USER){
                                        //警告框,并关闭窗口
                                    }
                                    reject(resp);
                                }
                                resolve(resp);
                            } else {
                                Common.toast('请求失败',Const.TOAST_ERROR)
                                reject(resp);
                            }
                        } catch (error) {
                            reject(error);
                            console.error('解析响应出错!'+error);
                        }
                    } else {
                        return Promise.reject(`ajax fail:${xhr.status}`);
                    }
                }
            };

            //HTTP异常处理
            xhr.onerror = () => {
                reject({
                    status: this.status,
                    statusText: xhr.statusText
                })
            }
            
            xhr.send(postData);
        });
    }
}

let http = new Http();
export default http;
  • service.js(专门封装业务请求)
import Http from '../utils/http'

/**
 * 微信jssdk对象初始化
 */
let wxInit = function() {
    return new Promise(function (resolve, reject) {
        Http.post(APIs.GET_WX_SIGNATURE, {
            'url': window.location.href
        }).then(function (res) {
            try {
                //获取相关参数
                let appId = res.data.appId;
                let timestamp = res.data.timestamp;
                let nonceStr = res.data.nonceStr;
                let signature = res.data.signature;

                AppGlobal.userInfo = {
                    debug: Const.WX_DEBUG,
                    appId: appId,
                    timestamp: timestamp,
                    nonceStr: nonceStr,
                    signature: signature,
                    jsApiList: Const.WX_API_LIST
                }

                //调用微信jssdk对象进行配置
                wx.config(AppGlobal.userInfo);

                wx.error(function () {
                    //return Promise.reject();
                    reject();
                })
            } catch (e) {
                //return Promise.reject();
                reject();
            }
            resolve();
        }).catch(function (res) {
            //return Promise.reject(res);
            reject();
        });
    })
}
阅读 23.4k
4 个回答

看你这个信息,是在返回json之后的调用地方出错了。可惜你截图正好没截取到

你的Http.post()返回的Promise是rejected状态的,code为300时执行的是return Promise.reject(`ajax fail:${xhr.status}`);。但service.js中,Http.post().then()中只传递了第一个参数,是用于处理resolved状态的Promise,所以rejected的Promise未被处理,会被浏览器捕获显示到控制台(Uncaught in promise)。你需要传递第二个参数,用于处理rejected状态的promise:

Http.post().then(
function(res){
  //...
},
function(err){
  console.err(err);
}
)

是不是你调用wxInit的时候没有catch异常

没弄明白这个题目到底在问什么。一般封装 Ajax 是为了统一接口,对异常数据进行统一处理,所以抛出异常没有什么问题啊。
说下抛出错误的大概位置吧。
第一个报错应该是在 http.js

Common.toast('请求失败',Const.TOAST_ERROR)
reject(resp);

第二个报错应该是在 service.js

.catch(function (res) {
  //return Promise.reject(res);
  reject();
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题