Promise改写的异步回调函数为何测试超时?
发布于 2 天前 作者 qingmingsang 264 次浏览 来自 问答

在koa2使用了其他模块,是异步的方法,把他用改成了promise函数,结果出了问题

import Koa from "koa";
import Router from "koa-router";
import request from "request";
import supertest from "supertest";

const app = new Koa();
const router = new Router();
const client = supertest.agent(app.listen(3000));

router
    .get("/send", async (ctx, next)=> {
        let params = {...}

        let aa = await Prequest(params);
        console.log(aa);//不打印
        ctx.status = 200;
    })

app
    .use(router.routes())
    .use(router.allowedMethods());

//测试错误   超时了   
describe("test", function () {
    this.timeout(10000);
    it("send", function (done) {
        client
            .get('/send')
            .expect(200,done)
    });
})
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出去
        })
    });
}
5 回复

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

非常感谢你的回答

回到顶部