我正在尝试编写一个位于memchached服务器之上的节点应用程序。目标是在几个站点之间共享一些数据,在memcache中缓存一些数据。
我在memcache中使用'get'找到的所有示例都返回一个promise,然后是console.log。但是,我需要返回给函数调用者的值。因此,我放宽了范围。
有任何一个例子可以作为阻止来电吗?
class TPCacheManager{
constructor(){
this.getVal = '';
}
setItem(type,key,item){
var mcacheClient = new MemcachePlus();
mcacheClient.set("TP:IDX","3");
}
getItem(key){
var mcacheClient = new MemcachePlus();
mcacheClient.get("TP:IDX").on((data, status, headers, config) => {
console.log(data.data);
this.getVal= data; // <-- make this value available to the class
});
}
theVal(){
return this.getVal;
}
}
答案 0 :(得分:1)
您的问题基本上转化为:
将天空刮板跳入装满水箱的最佳方法是什么? 鲨鱼头上戴着激光。
答案基本上是:&#34;你没有&#34;
为什么ECMAScript使用回调和promises以及async await语法(基本上是使用不同语法的承诺),here解释了文档链接和非常好的视频。
假设您正在使用this memecached客户端,您可以将值成员设置为promise,代码有点令人困惑,因为您在调用setItem时没有设置值。 GetItem设置了值,但我认为如果你将它命名为lastRetreivedValue(并且可能根据你的需要添加lastSetItem)会更好:
class TPCacheManager{
constructor(){
this.lastRetrievedValue = Promise.reject("No item has been set");
}
setItem(type,key,item){
var mcacheClient = new MemcachePlus();
//the caller may want to know when it's finished and if it failed
return mcacheClient.set("TP:IDX","3");
}
getItem(key){
var mcacheClient = new MemcachePlus();
const me = this;
//caller may want to know when it's finished and if it failed
return mcacheClient.get("TP:IDX").
then(value => {
console.log(value);
me.lastRetrievedValue= value;
//you may want to return value here so o.getItem().then(value
//actually resolves to something other than undefinded
});
}
theVal(){
return this.lastRetrievedValue;
}
}
//example how to use:
const cache = new TPCacheManager();
cache.lastRetrievedValue.catch(
err=>{
console.log("As expected, no value has been set",err);
}
);
cache.setItem("doesnt matter, you ignore all parameters here")
.catch(err=>console.error("Oops, something went wrong setting an item:",err));
cache.lastRetrievedValue
.catch(
err=>
console.log("Value still not set, setItem does not do this in your code",err)
);
cache.getItem("doesnt matter, you are ignoring parameters here")
.then(
value=>
console.log("Value is undefined because getItem resolves to undefined",value)
);
cache.lastRetrievedValue
.then(
value=>
console.log("Ok, I have value because getItem has set it:",value)
);
//you can repeat cache.lastRetrievedValueor cache.theVal() without connecting to
// memcached because you stored the promise
答案 1 :(得分:1)
兄弟......你真的会从阅读这篇文章中受益。每个使用promises的节点程序员都会。 https://medium.com/@brianalois/error-handling-in-node-javascript-suck-unless-you-know-this-2018-aa0a14cfdd9d