你在你的问题中说:
当然,如果您发布另一种方法来解决我的问题,我会为您的答案投票,如果没有关于任务的其他答案,我可以将其设置为解决方案。
好的; 抱歉,但我认为 c# 风格的任务在这里不是正确的解决方案。
我会接受(尽管我认为这不正确)您的断言,即出于安全原因您必须在客户端完成所有操作。顺便说一句,我是否可以指出,如果您害怕有人窥探(因为您有安全漏洞),那么传递大量对部分密码的请求与传递一个请求一样不安全?对不起,我似乎未经同意就这样做了!
尽管如此,我将尝试用一个粗略的大纲来回答,如果你确实必须用 JavaScript 来解决你的问题,我将如何解决它;我会使用承诺。具体来说,可能是 jQuery 的 Deferred 实现。我将在这里给出一个非常粗略的伪代码大纲。
概述
你从一个结构良好的 Trie 开始。使用递归,我将构建一个结构良好的“解决方案树”,它是一个嵌套的数组数组;这将提供能够以特定消息响应用户的灵活性......但是,由于您似乎准备失去该奖金并且只想要一个数字作为解决方案,我将概述一个稍微简单的方法,您可以,如果需要,适应形式的返回数组(来自您的示例):
[["myj"],["scode"],["my"],["js"],["code"]]
我在这里也提到了这种结构,部分原因是它有助于解释我采用的方法。
笔记
我将在您的 Trie 中引用“nodes”和“valueNodes”。我认为“节点”是任何东西,而“值节点”是具有值的节点。
递归 promiseToResolveRemainder 将解析 0 表示“无法做到”;如果出现问题(例如,网络服务不可用),它只会拒绝承诺。
狡猾,hacky,未经测试的伪代码
var minDepth=0; //Zero value represents failure to match (Impossible? Not if you are accepting unicode passwords!)
function promiseToResolveRemainder(remainder,fragmentSoFar){
deferred = new jQuery.Deferred();
nextChar = remainder.substring(0,1);
if (remainder.length==1){
//Insert code here to:
//Test for fragmentSoFar+nextChar being a valueNode.
//If so, resolve(1)... otherwise resolve(0)
//!!Note that, subtly, this catches the case where fragmentSoFar is an empty string :)
return;
}
remainder = remainder.substring(1);
promiseToFindValueNode(fragmentSoFar+nextChar).then(
function(success){
//We know that we *could* terminate the growing fragment here and proceed
//But we could also proceed from here by adding to the fragment
var firstPathResolvedIn = 0;
var secondPathResolvedIn = 0;
promiseToResolveRemainder(remainder,'').then(
function(resolvedIn){
firstPathResolvedIn = resolvedIn + 1;
}
).then(
promiseToResolveRemainder(remainder,fragmentSoFar+nextChar).then(
function(resolvedIn){
secondPathResolvedIn = resolvedIn;
if(!firstPathResolvedIn==0 and !secondPathResolvedIn==0){
deffered.resolve(Math.min(firstPathResolvedIn,secondPathResolvedIn));
}
deferred.resolve(Math.max(firstPathResolvedIn,secondPathResolvedIn));//Sloppy, but promises cannot be resolved twice, so no sweat (I know, that's a *dirty* trick!)
}
)
)
},
function(failure){
//We know that we *need* at least a node or this call to
//promiseToResolveRemainder at this iteration has been a failure.
promiseToFindNode(fragmentSoFar+nextChar).then(
function(resolvedIn){
//ok, so we *could* proceed from here by adding to the fragment
promiseToResolveRemainder(remainder,fragmentSoFar+nextChar).then(
function(resolvedIn){
deferred.resolve(resolvedIn);
}
)
},
function(failedBecause){
//ooops! We've hit a dead end, we can't complete from here.
deferred.resolve(0);
}
)
},
)
return deferred.Promise();
}
我对这种未经测试的笨拙的代码尝试并不特别自豪(而且我不打算为你编写解决方案!),但我为这种方法感到自豪,并相信它将产生一个健壮、可靠和高效的解决方案你的问题。不幸的是,您似乎依赖于很多webService 调用......因此,我很想抽象出对 webService 的任何调用并首先通过本地缓存检查它们。