在koa2使用了其他模块,是异步的方法,把他用改成了promise函数,结果出了问题
function Prequest(params) {
return new Promise(function (resolve, reject) {
request(params, function (error, response, body){
if (error || !body || body.code != 1) {
reject(error);
}
resolve(body);//并没有resolve出去
})
});
}
console.error(Boolean(error), Boolean(!body), Boolean(body.code != 1)); 看看是不是走到reject去了
有request-promise的模块
@hyj1991 还真是 进reject了。。。 但是为什么调用了reject后,却继续往下执行了resolve,这也就是为什么我说没有resolve出去。按理说不该说reject了就结束了吗?而且里面的错误也是null 大概是这样 ---------reject null ---------resolve {“msg”:“成功”}
router
.get("/send", async (ctx, next)=> {
try{
let params = {...}
let aa = await Prequest(params);
console.log(aa);//不打印
ctx.status = 200;
}catch(e){
console.error(e);
}
});
加一个try catch看看,因为走到了reject,所以let aa = await Prequest(params);下面不执行是正确的哇,因为相当于Promise调用链出现了异常 至于error是null,很简单哇,你是判断
if (error || !body || body.code != 1)
只要满足这个if就reject,这个if又是用了||, 那有可能是body为空,或者body.code != 1,进入了这个判断 此时error是null也是很正常的,你可以
if (error || !body || body.code != 1) {
let errObj = {};
errObj.error = error;
errObj.body = body;
errObj.code = body.code;
reject(errObj);
}
这样就保证走到reject有error返回 实际上,你一开始reject(error)里面的error,只是request出现类似ECONNRESET等socket错误或者传参异常导致的error,但是你又设置给自己获取的参数做了异常判断,即你认为就算request请求成功了,但是获取到的body为空,或者body.code != 1都是异常,所以光打印reject(error)当然不行了 建议lz先去看下ES6的Promise的api文档,理解下Promise的流程~
@hyj1991 是的,我后边排查发现确实是错误判定写错了。 另外就是我没加try catch,不加的话,就算reject了也还是会往下执行 resolve
非常感谢你的回答