吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3668|回复: 8
收起左侧

[其他转载] 【Node.js笔记】在AnyProxy的rule里局部去异步的实现方法

[复制链接]
locbytes 发表于 2018-7-14 11:38
本帖最后由 locbytes 于 2018-8-28 01:27 编辑

局部去异步是调用了一个叫deasync的包,该包的具体信息可以去npm官方介绍里查看[https://www.npmjs.com/package/deasync]
去异步主要是为了更方便的实现一些比较刁钻的业务逻辑。


[JavaScript] 纯文本查看 复制代码
const deasync = require('deasync');
const request = require('request');

let a = getRes(json);
function(a);

function getRes(jsonData) {
    let res, isReturn = false;
    request.post({
        url: url,
        form: {
            raw: jsonData
        }
        },
        function(err,httpResponse,body){
            if(httpResponse.statusCode===200){
                isReturn = true;
            }
            res=body;
        }
    );
    while(!isReturn){
        deasync.runLoopOnce();
    }
    return res;
}


例如使用anyproxy做某些业务的时候,去异步就能解决自定义规则中异步函数未执行完成就已经返回response的问题,代码参考如下:
[JavaScript] 纯文本查看 复制代码
const AnyProxy = require("anyproxy");
const deasync = require("deasync");
const request = require("request");
const options = {
    port: 8080,
    rule: {
        summary: "xxxxx",
        *beforeSendResponse(requestDetail, responseDetail) {
            let response = Object.assign({}, responseDetail.response);
            response.body = editResponseBody(rawBody);
            return {
                response: response
            };
        },
        *beforeDealHttpsRequest(requestDetail) {
            if(requestDetail.host.indexOf("xxxx")>=0){
                return true;
            }
        },
    },
    webInterface: {
        enable: true,
        webPort: 8081
    },
    throttle: 10240,
    forceProxyHttps: false,
    wsIntercept: false,
    silent: true
};
const proxyServer = new AnyProxy.ProxyServer(options);
proxyServer.start();
console.log("Start, port on "+options.port);
proxyServer.close();

// 因为需求原因将数据通过post请求交给PHP进行处理
function editResponseBody(rawBody) {
    let newBody, isReturn = false;
    request.post({
        url: "xxxx",
        form: {
            raw: rawBody
        }
        },
        function(err,httpResponse,body){
            if(httpResponse.statusCode===200){
                isReturn = true;
            }
            newBody=body;
        }
    );
    while(!isReturn){
        deasync.runLoopOnce();
    }
    return newBody;
}

首先自定义规则内部无法使用async/await,其次写回调的话会出现未回调但是已经返回response的问题。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vivilauge 发表于 2018-7-14 13:25
把request封装成promise在哪里都可以调用,岂不快哉
 楼主| locbytes 发表于 2018-7-14 23:03
vivilauge 发表于 2018-7-14 13:25
把request封装成promise在哪里都可以调用,岂不快哉

这个不针对request,只针对那些刁钻的业务逻辑,比如多个异步函数要求按顺序依次执行,下一个异步函数调用上一个异步函数的返回值。
vivilauge 发表于 2018-7-15 13:03
locbytes 发表于 2018-7-14 23:03
这个不针对request,只针对那些刁钻的业务逻辑,比如多个异步函数要求按顺序依次执行,下一个异步函数调 ...

promise 本身就是异步啦, 无论是request模块,还是http模块,ajax,都可以这样封装,封装好之后,再用异步调异步,如果你懂ES6语法,还可以直接用async await,一目了然
whitehack 发表于 2018-7-15 14:02
async/await   比你这个优雅多了。
 楼主| locbytes 发表于 2018-7-16 10:46
vivilauge 发表于 2018-7-15 13:03
promise 本身就是异步啦, 无论是request模块,还是http模块,ajax,都可以这样封装,封装好之后,再用异 ...

我只能说有些业务逻辑无法实现...
 楼主| locbytes 发表于 2018-7-16 10:47
whitehack 发表于 2018-7-15 14:02
async/await   比你这个优雅多了。

有些业务逻辑依然无法实现,要不也不至于出这么个去异步的包。
vivilauge 发表于 2018-7-16 20:01
不知道什么业务逻辑是这种大杀器解决不了的, 说出来长长见识呀。
 楼主| locbytes 发表于 2018-7-28 17:45
vivilauge 发表于 2018-7-16 20:01
不知道什么业务逻辑是这种大杀器解决不了的, 说出来长长见识呀。

代码里已经写了...
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 17:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表