【发布时间】:2019-05-03 09:27:21
【问题描述】:
最近我一直在尝试实现我自己的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方法将它传递给Storage。
但实际上看起来当sendWebKitMessage(LS_GET_ITEM, { key: key })被调用时,'线程'并没有被阻塞,客户端可以多次调用这个方法并且回调不能正常工作。
我是一个 JS 新手,我希望它会像互斥锁一样工作。这实际上可以在 JS 中实现,还是我在构建完全错误的东西。 我打算只使用 vanilla JS。
【问题讨论】:
标签: javascript ios webkit wkwebview