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

时间:2016-01-29 10:32:00

标签: javascript node.js recursion promise bluebird

如果想要的slugged字符串可用,我正在尝试编写一个“slug验证器”来查询我的数据库。

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

示例:

  • 我想在我的数据库中插入my-slugged-string。我想检查一下 my-slugged-string可用(尚未使用)。
  • 我查询我的 使用my-slugged-string的数据库,如果它已经存在,请尝试 再次使用my-slugged-string1,如果它已经存在则再次尝试 与my-slugged-string2等...
  • 如果my-slugged-stringx不存在,请返回此值。

首先,这是我的代码

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正确的值),不会返回任何内容,并且进程不会停止并保持为eeeveeer奔跑......直到超时到来! :) :) :))

我可能在javascript promises原则上遗漏了一些东西。

我会帮助你的帮助人员;)

编辑:感谢@Adam,代码编辑

1 个答案:

答案 0 :(得分:0)

是的,因为return中没有findAvailable声明,所以不会返回任何内容!在此处添加:

function findAvailable(label, stringToTest, i = ''){
    const mixedString = stringToTest + i;
    let query = `g.V().has(label, '${label}').has('slug', '${mixedString}')`;
    return client.executeAsync(query)
//  ^^^^^^
        .then(…);
}

那就是说,你所写的模块现在已经回复了一个承诺。没有必要对它进行宣传 - 事实上,它不会因为没有回复而无法进行宣传。请勿在其上调用promisifyAll,请勿使用Async后缀进行方法调用:

…
export function create(item = {}, callback) {
    …
    return slug.generateNew('item', 'my string to slug and test')
//              ^^^^^^^^^^^
        .then((sluggedstring)=>{
            … 
        });
}