搜尋

首頁  >  問答  >  主體

node.js - Promise改写的异步回调函数为何测试超时?

在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出去
        })
    });
}
ringa_leeringa_lee2784 天前878

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 14:37:15

    koa沒用過,一直覺得這種古怪的利用generator做中間件的手段太過“引人入勝”,實在不敢冒用。 (可能我太low了)

    首先,(由於不懂koa),不清楚如下設定status的方法是否正確:

    ctx.status = 200;

    其次,測驗可以這麼改改試試:

    describe("test", function () {
        this.timeout(10000);
        it("send", function (done) {
            client
                .get('/send')
                .expect(200)
                .end(function(err, res) {
                    if (err) return done(err);
                    done();
                });
        });
    })

    補充:

    我看koa-router 7.x配合koa 2.x才支援async/await文法,你確定版本都用對了吧?

    對照官方的例子來看看吧supports promises for async/await

    最後,真心沒用過這怪玩意,你自己多找文件吧

    再補充:

    的確,如@wusisu 所說,你的request寫的有點問題,應該改改:

    function Prequest(params) {
        return new Promise(function (resolve, reject) {
            request(params, function (error, response, body){
                if (error || !body || body.code != 1) {
                    return reject(error);//这里一定要return出去
                }
                resolve(body);
            })
        });
    }

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 14:37:15

    我是koa@2的老司機了。
    不過問題不在koa上,而是那個Promise沒有回來。

    我也一樣沒有看懂request這個函數的使用,建議在request的回呼中,印一下看看。

    回覆
    0
  • 取消回覆