鍍金池/ 問答/HTML/ js發(fā)送請求,確定請求有值后返回結果

js發(fā)送請求,確定請求有值后返回結果

當我發(fā)送一個ajax請求后臺結果的時候,后臺返回數(shù)據(jù)的時間是不等

因為使用到了區(qū)塊鏈技術,當前臺去請求一個智能合約(方法)的時候后臺執(zhí)行的步驟是:

1.執(zhí)行方法(執(zhí)行智能合約)
2.生成區(qū)塊(過程時間不等100ms-2000ms)
3.返回結果給前臺

前端發(fā)送請求的過程:

  • 1.發(fā)送一個請求(智能合約)
    例:http://127.0.0.1/contract
  • 2.再發(fā)送一個請求?(查看后臺是否返回結果)
    例:http://127.0.0.1/status

    如果后臺還沒有將數(shù)據(jù)寫入?yún)^(qū)塊返回的結果為:?

    blockid: 
    result:

    如果后臺已經(jīng)將數(shù)據(jù)寫入?yún)^(qū)塊返回的結果為:

    blockid: 1
    result: {name: "xxxx", age: "20"}
  • 3.等待后臺返回數(shù)據(jù)(因為后臺返回的數(shù)據(jù)時間是100ms-2000ms)所以我們目前都是調(diào)用智能合約(方法)http://127.0.0.1/contract后過2s再去調(diào)用http://127.0.0.1/status

現(xiàn)如今遇到的問題:

  • 前端每次調(diào)用一個合約(方法)需要等待(2s)導致用戶體驗非常不好

現(xiàn)在我們想到的辦法是能不能循環(huán)的去調(diào)用http://127.0.0.1/status這個合約(方法)然后在里面做判斷,當blockid和result不等于空的時候就把數(shù)據(jù)返回。

請問如何使用jquery和原生javascript去做這個循環(huán)或者Promise去解決這個問題。

下面我貼一段代碼,是在網(wǎng)上找到的一個例子使用的是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
            }
        })));
    });

請盡可能的回答多種解決的辦法并且貼出示例代碼

回答
編輯回答
我不懂

你可以了解下websocket和輪詢,看哪種比較適合你的項目需求

2018年5月16日 15:26
編輯回答
茍活

可以考慮用websocket,有消息時服務器主動推送到前臺頁面

2017年2月10日 21:25
編輯回答
逗婦惱

我覺得你可以考慮一下websocket的方式,ajax畢竟還是一個請求一個響應。不過websocket后臺也要相應支持,具體可以詳細探討一下

2017年2月26日 00:09