承诺的递归函数不会触发 return 语句

Promised recursive function does not trigger return statement

我正在尝试编写一个 "slug validator" 查询我的数据库是否有所需的 slugged 字符串。

为此,我使用递归函数递增一个数字并测试它与我的 slugged 字符串连接。

示例:

首先,这是我的代码

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)=>{
            … 
        });
}