js中ajax返回结果判断,js发送请求,确定请求有值后返回结果

当我发送一个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去解决这个问题。

下面我贴一段代码,是在网上找到的一个例子使用的是react的rxjs包中的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(

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

}

})));

});

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