当我发送一个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
}
})));
});
请尽可能的回答多种解决的办法并且贴出示例代码