Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点、承诺、返回值_Javascript_Node.js_Memcached_Blocking - Fatal编程技术网

Javascript 节点、承诺、返回值

Javascript 节点、承诺、返回值,javascript,node.js,memcached,blocking,Javascript,Node.js,Memcached,Blocking,我正在尝试编写一个节点应用程序,它位于memchached服务器的顶部。目标是在多个站点之间共享一些数据,在memcache中缓存一些数据 我发现的所有使用memcache中的“get”的示例都会返回一个承诺,然后返回console.log。但是,我需要将的值返回给函数的调用方。因此,我放宽了范围 有人举过这样的例子吗 class TPCacheManager{ constructor(){ this.getVal = ''; } setItem(ty

我正在尝试编写一个节点应用程序,它位于memchached服务器的顶部。目标是在多个站点之间共享一些数据,在memcache中缓存一些数据

我发现的所有使用memcache中的“get”的示例都会返回一个承诺,然后返回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;
    }

}

你的问题基本上可以转化为:

从空中铲运机上跳到装满水的坦克上最好的方法是什么 头上有激光的鲨鱼

答案基本上是:你没有

ECMAScript使用回调和承诺以及异步等待语法的原因基本上是使用不同语法的承诺,通过文档链接和一个非常好的视频解释了这一点

假设您使用的是memecached客户机,您可以将value成员设置为promise,代码会有点混乱,因为在调用setItem时您没有设置value。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

你想在nodejs中使用阻塞get吗?我有一个调用memcache.get的类-我需要将返回的值分配给一个类成员。如果没有任何代码,很难想象你想要什么,但是,阻塞很少是你在nodejs中想要的-学会处理异步代码你在使用什么memcache客户端?我在文档中找不到.on。您可以查找同步memcache客户端,但不确定是否有人会创建这样的东西。您可以将this.val设置为承诺,并在类的api中使用ObjectInstance.val.thenactualValue=>?如果允许更改api,您可以将回调传递给getItem函数或使其返回承诺。感谢您的努力。然而,'console.logOk,我有值,因为getItem设置了它:,value'似乎永远不会执行。?@t如果捕获它会发生什么?cache.lastRetrievedValue.catcherr=>console.errorerr