承诺的递归函数不会触发 return 语句
Promised recursive function does not trigger return statement
我正在尝试编写一个 "slug validator" 查询我的数据库是否有所需的 slugged 字符串。
为此,我使用递归函数递增一个数字并测试它与我的 slugged 字符串连接。
示例:
- 我想在我的数据库中插入
my-slugged-string
。我想检查是否
my-slugged-string
可用(尚未使用)。
- 我查询我的
my-slugged-string
的数据库,如果它已经存在,尝试
再次使用 my-slugged-string1
,如果它已经存在,请重试
与 my-slugged-string2
等...
- 如果
my-slugged-stringx
不存在,return这个值。
首先,这是我的代码
import nodeGremlin from 'gremlin';
import gremlin from 'gremlin-template-string';
import slug from 'slug';
import Promise from 'bluebird';
let client = nodeGremlin.createClient(8182, 'localhost');
client = Promise.promisifyAll(client);
module.exports.generateNew = function (label, stringToSlug) {
let sluggedString = slug(stringToSlug, {lower: true});
return findAvailable(label, sluggedString);
}
function findAvailable(label, stringToTest, i = ''){
const mixedString = stringToTest + i;
let query = `g.V().has(label, '${label}').has('slug', '${mixedString}')`;
return client.executeAsync(query)
.then((item) => {
if (item[0]){
if (i === '') i = 0;
return findAvailable(label, stringToTest, ++i);
}
// breakpoint
console.log(mixedString);
return mixedString;
})
.catch((err) => {
// manage error
});
}
我这样调用这段代码
import * as Slug from './slug';
import Promise from 'bluebird';
let slug = Promise.promisifyAll(Slug);
export function create(item = {}, callback) {
// [...]
slug.generateNewAsync('item', 'my string to slug and test')
.then((sluggedstring)=>{
//bla bla bla
})
// [...]
}
我的问题是,即使到达断点(算法有效,我已经测试过:我可以 console.log
正确的值),也不会 returned 并且进程不会停止并继续运行 eeeveeer ... 直到超时! :) :) :)
我可能遗漏了 javascript 承诺原则。
感谢你们的帮助 ;)
编辑:感谢@Adam,已编辑代码
是的,不会 return 编辑任何内容,因为 findAvailable
中没有 return
语句!在这里添加:
function findAvailable(label, stringToTest, i = ''){
const mixedString = stringToTest + i;
let query = `g.V().has(label, '${label}').has('slug', '${mixedString}')`;
return client.executeAsync(query)
// ^^^^^^
.then(…);
}
也就是说,您编写的模块现在已经 return 成为一个承诺。没有必要承诺它——事实上,它不会与承诺一起工作,因为它不需要回调。不要在上面调用promisifyAll
,方法调用不要使用Async
后缀:
…
export function create(item = {}, callback) {
…
return slug.generateNew('item', 'my string to slug and test')
// ^^^^^^^^^^^
.then((sluggedstring)=>{
…
});
}
我正在尝试编写一个 "slug validator" 查询我的数据库是否有所需的 slugged 字符串。
为此,我使用递归函数递增一个数字并测试它与我的 slugged 字符串连接。
示例:
- 我想在我的数据库中插入
my-slugged-string
。我想检查是否my-slugged-string
可用(尚未使用)。 - 我查询我的
my-slugged-string
的数据库,如果它已经存在,尝试 再次使用my-slugged-string1
,如果它已经存在,请重试 与my-slugged-string2
等... - 如果
my-slugged-stringx
不存在,return这个值。
首先,这是我的代码
import nodeGremlin from 'gremlin';
import gremlin from 'gremlin-template-string';
import slug from 'slug';
import Promise from 'bluebird';
let client = nodeGremlin.createClient(8182, 'localhost');
client = Promise.promisifyAll(client);
module.exports.generateNew = function (label, stringToSlug) {
let sluggedString = slug(stringToSlug, {lower: true});
return findAvailable(label, sluggedString);
}
function findAvailable(label, stringToTest, i = ''){
const mixedString = stringToTest + i;
let query = `g.V().has(label, '${label}').has('slug', '${mixedString}')`;
return client.executeAsync(query)
.then((item) => {
if (item[0]){
if (i === '') i = 0;
return findAvailable(label, stringToTest, ++i);
}
// breakpoint
console.log(mixedString);
return mixedString;
})
.catch((err) => {
// manage error
});
}
我这样调用这段代码
import * as Slug from './slug';
import Promise from 'bluebird';
let slug = Promise.promisifyAll(Slug);
export function create(item = {}, callback) {
// [...]
slug.generateNewAsync('item', 'my string to slug and test')
.then((sluggedstring)=>{
//bla bla bla
})
// [...]
}
我的问题是,即使到达断点(算法有效,我已经测试过:我可以 console.log
正确的值),也不会 returned 并且进程不会停止并继续运行 eeeveeer ... 直到超时! :) :) :)
我可能遗漏了 javascript 承诺原则。
感谢你们的帮助 ;)
编辑:感谢@Adam,已编辑代码
是的,不会 return 编辑任何内容,因为 findAvailable
中没有 return
语句!在这里添加:
function findAvailable(label, stringToTest, i = ''){
const mixedString = stringToTest + i;
let query = `g.V().has(label, '${label}').has('slug', '${mixedString}')`;
return client.executeAsync(query)
// ^^^^^^
.then(…);
}
也就是说,您编写的模块现在已经 return 成为一个承诺。没有必要承诺它——事实上,它不会与承诺一起工作,因为它不需要回调。不要在上面调用promisifyAll
,方法调用不要使用Async
后缀:
…
export function create(item = {}, callback) {
…
return slug.generateNew('item', 'my string to slug and test')
// ^^^^^^^^^^^
.then((sluggedstring)=>{
…
});
}