Align nextTick in decorate with other usages (#5184)

This commit is contained in:
Jaco
2022-08-26 13:13:14 +03:00
committed by GitHub
parent 2b562c80b9
commit efd76e3e20
2 changed files with 24 additions and 15 deletions
+8 -8
View File
@@ -99,14 +99,14 @@ export const query = firstMemo(
export function queryMulti (instanceId: string, api: DeriveApi): (accountIds: (Uint8Array | string)[], flags: StakingQueryFlags) => Observable<DeriveStakingQuery[]> {
return memo(instanceId, (accountIds: (Uint8Array | string)[], flags: StakingQueryFlags): Observable<DeriveStakingQuery[]> =>
accountIds.length
? api.derive.session.indexes().pipe(
switchMap(({ activeEra }): Observable<DeriveStakingQuery[]> => {
const stashIds = accountIds.map((accountId) => api.registry.createType('AccountId', accountId));
api.derive.session.indexes().pipe(
switchMap(({ activeEra }): Observable<DeriveStakingQuery[]> => {
const stashIds = accountIds.map((a) => api.registry.createType('AccountId', a));
return getBatch(api, activeEra, stashIds, flags);
})
)
: of([])
return stashIds.length
? getBatch(api, activeEra, stashIds, flags)
: of([]);
})
)
);
}
+16 -7
View File
@@ -844,21 +844,29 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
let valueIdx = 0;
let valueObs: Observable<Codec[]>;
// if we don't have queue entries yet,
// or the current queue has fired (see from below),
// or the current queue has the max entries,
// then we create a new queue
if (queueIdx === -1 || !queue[queueIdx] || queue[queueIdx][1].length === PAGE_SIZE_Q) {
queueIdx++;
valueObs = from(
// Defer to the next tick - this aligns with nextTick in @polkadot/util,
// however since we return a value here, we don't re-use what is there
Promise
.resolve()
.then((): [StorageEntry, unknown[]][] => {
// we delay the execution until the next tick, this allows
// any queries made in this timeframe to be added to the same
// queue for a single query
new Promise<[StorageEntry, unknown[]][]>((resolve): void => {
nextTick((): void => {
// get all the calls in this instance, resolve with it
// and then clear the queue so we don't add more
// (anyhting after this will be added to a new queue)
const calls = queue[queueIdx][1];
delete queue[queueIdx];
return calls;
})
resolve(calls);
});
})
).pipe(
switchMap((calls) => query(calls))
);
@@ -872,6 +880,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
}
return valueObs.pipe(
// return the single value at this index
map((values) => values[valueIdx])
);
}