账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js发送请求,确定请求有值后返回结果
    26
    0

    当我发送一个ajax请求后台结果的时候,后台返回数据的时间是不等

    因为使用到了区块链技术,当前台去请求一个智能合约(方法)的时候后台执行的步骤是:

    1.执行方法(执行智能合约)
    2.生成区块(过程时间不等100ms-2000ms)
    3.返回结果给前台

    前端发送请求的过程:

    • 1.发送一个请求(智能合约)
      例:http://127.0.0.1/contract
    • 2.再发送一个请求 (查看后台是否返回结果)
      例:http://127.0.0.1/status

      如果后台还没有将数据写入区块返回的结果为: 

      blockid: 
      result:

      如果后台已经将数据写入区块返回的结果为:

      blockid: 1
      result: {name: "xxxx", age: "20"}
    • 3.等待后台返回数据(因为后台返回的数据时间是100ms-2000ms)所以我们目前都是调用智能合约(方法)http://127.0.0.1/contract后过2s再去调用http://127.0.0.1/status

    现如今遇到的问题:

    • 前端每次调用一个合约(方法)需要等待(2s)导致用户体验非常不好

    现在我们想到的办法是能不能循环的去调用http://127.0.0.1/status这个合约(方法)然后在里面做判断,当blockid和result不等于空的时候就把数据返回。

    请问如何使用jquery和原生javascript去做这个循环或者Promise去解决这个问题。

    下面我贴一段代码,是在网上找到的一个例子使用的是reactrxjs包中的Observable模块:

    const txExecEpic: Epic = (action$, store, { api }) => action$.ofAction(txExec.started)
        .flatMap(action => {
            const state = store.getState();
            const client = api(state.auth.session);
            const publicKey = keyring.generatePublicKey(action.payload.privateKey, true);
    
            // 密码校验
            if (!keyring.validatePrivateKey(action.payload.privateKey)) {
                return Observable.of(txExec.failed({
                    params: action.payload,
                    error: {
                        type: 'E_INVALID_PASSWORD',
                        error: null
                    }
                }));
            }
    
            return Observable.fromPromise(client.txCall({
                requestID: action.payload.requestID,
                pubkey: publicKey,
                signature: action.payload.signature,
                time: action.payload.time
    
            })).flatMap(result => Observable.defer(() => client.txStatus({
                hash: result.hash
    
            }).then(status => {
                if (!status.blockid && !status.errmsg) {
                    throw 'E_PENDING';
                }
                else {
                    console.log(status);
                    return status;
                }
    
            })).retryWhen(errors =>
                errors.delay(100)
    
            ).flatMap(txResult => {
                if (txResult.blockid) {
                    const actions = Observable.of<Action>(
                        txExec.done({
                            params: action.payload,
                            result: {
                                block: txResult.blockid,
                                result: txResult.result
                            }
                        }),
                        authorize(action.payload.privateKey)
                    );
    
                    if (action.payload.tx.silent) {
                        return actions;
                    }
                    else {
                        return actions.concat(Observable.of(enqueueNotification({
                            id: uuid.v4(),
                            type: 'TX_SUCCESS',
                            params: {
                                block: txResult.blockid,
                                tx: action.payload.tx
                            }
                        })));
                    }
                }
                else {
                    return Observable.of(txExec.failed({
                        params: action.payload,
                        error: {
                            type: txResult.errmsg.type as TTxError,
                            error: txResult.errmsg.error
                        }
                    }));
                }
    
            })).catch(error => Observable.of(txExec.failed({
                params: action.payload,
                error: {
                    type: (error.errmsg ? error.errmsg.type : error.error) as TTxError,
                    error: error.errmsg ? error.errmsg.error : error.msg
                }
            })));
        });

    请尽可能的回答多种解决的办法并且贴出示例代码

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版

    回答动态

    师傅被妖怪抓走了:发布了悬赏问题火爆全网的“元宇宙”到底是什么?预计能赚取 1积分收益
    酒后略带风情:发布了悬赏问题Android内存中Graphics与Code占用过高预计能赚取 10积分收益
    扛起拖把扫天下:发布了悬赏问题typescript如何导出接口配置?求解,谢谢!预计能赚取 10积分收益
    发布了悬赏问题Vue 如何改变返回页面的路径?如让B页面只能返回到A页面.预计能赚取 11积分收益
    发布了悬赏问题vue H5移动端;底部bottom固定定位,安卓弹起键盘导致页面变形如何解决?预计能赚取 10积分收益
    发布了悬赏问题请问为什么tomcat8.5 GET请求中文正常,POST请求还需要设置UTF-8.预计能赚取 10积分收益
    发布了悬赏问题vue2.5+ts创建以及引入jq的方法预计能赚取 11积分收益
    情场浪女:发布了悬赏问题import ggplot时报错module 'pandas' has no attribute 'tslib'预计能赚取 10积分收益
    见心书画许老师18753375161:发布了悬赏问题echarts3 legend禁止点击事件,允许悬浮事件预计能赚取 11积分收益
    aa_92cb0bd09f:发布了悬赏问题codewar上的一个问题预计能赚取 11积分收益