переполнение сообщества!
Недавно я пытался реализовать свою собственную реализацию LocalStorage, но вместо того, чтобы хранить данные в JS, я пытаюсь хранить данные на собственной стороне iOS в NSUserDefaults.Я покажу вам некоторый код, чтобы прояснить, о чем я говорю.У меня есть такой метод для моего собственного прототипа LocalStorage:
Storage.prototype.getItem = (function (key) {
var that = this;
var getValue = (function () {
return new Promise(resolve => {
// JS2Native request value for a specific key
sendWebKitMessage(LS_GET_ITEM, { key: key });
console.log("new Promise for key=" + key + " timeInMs=" + Date.now());
// create success callback
that.onKeyValueReceived = function (keyValuePair) {
if (keyValuePair !== null) {
console.log("onKeyValueReceived=" + keyValuePair.key + " value=" + keyValuePair.value);
resolve(keyValuePair.value);
}
else {
console.log("onKeyValueReceived=null for=" + key);
resolve(null);
}
};
});
});
// handle async response from the Native side
var waitFuntion = (async function () {
var value = await getValue();
console.log("value="+value);
return value;
});
return waitFuntion();
});
// Native2JS helper methods
Storage.prototype.pasKeyValuePair = function (key, value) {
this.onKeyValueReceived(key, value);
};
В методе getItem я предполагаю, что когда клиент вызывает его, он будет ждать, пока собственная сторона iOS получит это значение из NSUserDefaults и передаст егоХранение с помощью метода Storage.prototype.pasKeyValuePair.
Но на самом деле это выглядит так, что когда вызывается sendWebKitMessage(LS_GET_ITEM, { key: key })
, поток не блокируется, и клиент может вызвать этот метод еще несколько раз, и обратный вызов не работает должным образом.
Я новичок в JS, я ожидал, что он будет работать как мьютекс.Это действительно возможно реализовать в JS, или я строю что-то совершенно неправильно.Спасибо за преимущество!
PS Я планирую сделать это, используя только ванильный JS.