关于promise里面then返回reject的疑问

我在typescript项目里用reqwest写了一个公共的请求方法:

function postReq(
    obj: {
        url: string,
        headers?: any,
        data?: Object,
        type?: string,
        method?: string,
        contentType?: string
    }) {
    return Reqwest({
        url: obj.url,
        method: 'post',
        type: obj.type||'json',
        contentType:obj.contentType||'application/json',
        data: JSON.stringify(obj.data||{}),
        headers: obj.headers||{}
    }).then((res:Response) => {
        if (res.status.code != 0) {
            // return Promise.reject(res);
            throw new Error('数据错误');
        } else {
            return res;
        }
    }).fail((err,msg) => {
        console.log(err);
        let errBody;
        try {
            errBody = JSON.parse(err.response)
            errBody = errBody.status.msg;
        } catch (error) {
            errBody = 'JSON 编译出错'
        }
        message.error(errBody);
        // alert(`接口出错!${errBody}`);
    });
}

在调用的时候这样调用:

        postReq({
          url: '/api/prod/save',
          data: body
        })
        .then((res:Response) => {
            // do somthing when resolve
        });

现在的问题是,有些时候能捕获到异常,有些时候又不能捕获。
我现在的问题是,我在then里面throw一个错误,为什么不会跳到fail函数里执行呢?

阅读 10.4k
3 个回答

記得Reqwest返回的不是Promise/A+或ES6, 是個自己的Promise實現

我都是Promise.resolve(reqwest()) 這樣用的

我简单试了一下
这个fail函数意义上并不是发生错误就会调用
这个fail函数实际上无关promise,只是ajax请求的失败函数
只要请求成功,就会跳到then方法中的回调,只要请求失败,就会跳到fail方法中的回调
所以就算你在then方法的回调中抛出错误,也没有改变请求已经成功的事实
看reqwest的源码上也有一些说明性的注释
https://github.com/ded/reqwest/blob/master/reqwest.js#L399
https://github.com/ded/reqwest/blob/master/reqwest.js#L416
https://github.com/ded/reqwest/blob/master/reqwest.js#L428

没看你代码。针对promise我就举个例子吧。 自己稍微捋一捋

var promise = new Promise(function(resolved,reject){
    //这个是你要执行的代码
    ...
    ...
    if(某种成功条件){
        resolved("成功标记返回的字符");
    }else{
        reject("看我形参名也知道是 拒绝咯,表相反的某种条件嘛");
    }
});

promise.then(function(resolved){
    //如果 在你 上述的 promise对象里面的 的回掉函数里面 resolved()了;就会进入then的第一个函数参数;
    //而这里的 resolved就是你前面 传过来的 标记 值
},function(reject){
    //如果 在你 上述的 promise对象里面的 的回掉函数里面 reject()了;就会进入then的第二个函数参数;
    //而这里的 reject就是你前面 传过来的 标记 值
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题