Using ionic app validating token based auth, Storing the token in localstorage it is taking time to store in between it is moving to next state is any solution to do asynchronous way to set value in localstorage
window.localStorage.setItem('ChemistloggedInUser', JSON.stringify(data))
localStorage
is a synchronous API. You could defer the setItem
method execution with the Promise
object, giving them an asynchronous behaviour:
const asyncLocalStorage = {
setItem(key, value) {
return Promise.resolve().then(function () {
localStorage.setItem(key, value);
});
},
getItem(key) {
return Promise.resolve().then(function () {
return localStorage.getItem(key);
});
}
};
// Demo
const data = Date.now() % 1000;
asyncLocalStorage.setItem('mykey', data).then(function () {
return asyncLocalStorage.getItem('mykey');
}).then(function (value) {
console.log('Value has been set to:', value);
});
console.log('waiting for value to become ' + data +
'. Current value: ', localStorage.getItem('mykey'));
(Instead of Promise.resolve().then
you can also use queueMicrotask. It achieves the same, but without creating/returning a promise, so you cannot chain a then
call then).
With the newer async
/await
syntax, this asyncLocalStorage
can be written as:
const asyncLocalStorage = {
async setItem(key, value) {
await null;
return localStorage.setItem(key, value);
},
async getItem(key) {
await null;
return localStorage.getItem(key);
}
};
Be aware that, although the above let's you continue with other code immediately, once that code has been executed, the job of accessing local storage will kick in and will use the same thread. So it is not like it runs in the background, in parallel with your own JS code. It just delays the job until after the call stack is empty. It also does not process other events from the browser context until it also finishes that job. So, for instance, it will still block the GUI.
If you need the access to happen in parallel, then you're out of luck with localStorage
. For instance, that API is not available in Web Workers, which would otherwise have been a possible way out.
You could look into the IndexedDB API
as an alternative. But: