Javascript 如何等待回调来解析JS中的承诺?同步iOS WKWebView和JS
最近,我一直在尝试实现自己的Javascript 如何等待回调来解析JS中的承诺?同步iOS WKWebView和JS,javascript,ios,webkit,wkwebview,Javascript,Ios,Webkit,Wkwebview,最近,我一直在尝试实现自己的LocalStorage实现,但我没有将数据存储在JS中,而是尝试将数据存储在iOS本机端的NSUserDefaults中。我会给你看一些代码,让你明白我在说什么。对于我自己的LocalStorageprototype,我有这样的方法: Storage.prototype.getItem = (function (key) { var that = this; var getValue = (function () { return n
LocalStorage
实现,但我没有将数据存储在JS中,而是尝试将数据存储在iOS本机端的NSUserDefaults
中。我会给你看一些代码,让你明白我在说什么。对于我自己的LocalStorage
prototype,我有这样的方法:
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中实现,或者我构建的东西完全错了。
我计划只使用vanilla JS。我想我知道你想做什么。如果我错了,请纠正我。 是的,我们可以在处理其他代码之前等待Storage.getItem。但是,为此,我们需要在调用getItem时使用async Wait 请检查此代码:
var Storage = function() {};
Storage.prototype.getItem = function(key) {
var promise = new Promise(function(resolve, reject) {
//Fetch your item here and resolve the value. setTimeout is just for example.
setTimeout(function() {
resolve("Some value goes here.");
}, 2000);
});
return promise;
};
(async function() {
var storage = new Storage();
console.log("I am called BEFORE Storage.getItem");
var item = await storage.getItem("key");
console.log(item);
console.log("I am called AFTER Storage.getItem");
console.log("Storage.getItem second time");
item = await storage.getItem("key");
console.log(item);
//do something else
})();
这不会等待Storage.getItem:
var storage = new Storage();
console.log("I am called BEFORE Storage.getItem");
var item = storage.getItem("key");
console.log(item);
console.log("I am called AFTER Storage.getItem");
请检查@CodePen
我不能测试你的代码。 但是,以下是我能理解的。 我假设
getValue
的承诺得到了正确的解决。
行中有错误:var value=await getValue()代码>。它不等待任何东西,因为它没有什么可等待的。这是马上得到承诺对象
因此,请尝试以下方法:
var waitFuntion = (async function () {
var value;
await getValue().then(function(_value) {
value = _value;
});
console.log("value="+value);
return value;
});
这可以确保等到getValue
的承诺实际解决了这个值。是的,你是对的。谢谢但是,实际上是否有可能阻止holeStorage.prototype.getItem
方法,因此对它的任何下一次调用都将被阻止,直到上一次调用收到其对应键的值为止?