簡體   English   中英

Node.js,redis自動完成器,關閉

[英]Nodejs,redis autocompleter, closures

*代碼被重寫

我正在嘗試將antirez的自動完成程序轉換為javascript以與node.js一起使用。

我無法通過閉包問題。 也許有人可以幫助我。

我知道問題出在哪里,但不知道如何解決。

while循環正在觸發,中斷不正確,將無法正常工作等。

碼:

var acp = {

  vars: {

    dict     : false,
    count    : false,
    prefix   : false,
    rangeLen : 10,
    start    : false,
    results  : false,
    range    : false,

  },

  sendResults: function(){
    console.log(acp.vars.results);
  },

  getzrank: function(){

    redis.zrank( acp.vars.dict, acp.vars.prefix, function( err, start ){

      acp.vars.start = start;

    });

  },

  getzrange: function(){

    redis.zrange( acp.vars.dict, acp.vars.start, parseFloat( acp.vars.start+acp.vars.rangeLen-1 ), function( err, range ){

      acp.vars.range = range;

    });

  },

  createAutocomplete: function(){

    while( acp.vars.results.length != acp.vars.count ){

      acp.getzrange();

      acp.vars.start+=acp.vars.rangeLen;

      if( ! acp.vars.range || acp.vars.range.length == 0 ) { break; }

      for ( var i in acp.vars.range ){

        var minLen =  Math.min(i.length,acp.vars.prefix.length); 

        if( i.substr( 0, minLen ) != acp.vars.prefix.substr( 0, minLen ) ){ 

          acp.vars.count = acp.vars.results.length;

        }

        if( i.substr( 0, i.length-1 ) == "*" && acp.vars.results.length != acp.vars.count) {

          acp.vars.results.push( i.substr(0,-1) );

        }

      }

    }

    acp.sendResults();

  },

  init: function(dict,prefix,count){

    acp.vars.range   = false;

    acp.vars.dict    = dict;
    acp.vars.prefix  = prefix;
    acp.vars.count   = count;
    acp.vars.results = [];

    acp.vars.start   = acp.getzrank();

    if( ! acp.vars.start ){ acp.sendResults(); }
    else{ acp.createAutocomplete(); }

  }

}

break語句嵌套在匿名函數中,因此它不在while循環的范圍內。 不確定是否可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM