2016-01-29 3 views
0

Я пытаюсь написать «проверку валидатора», запрашивая мою базу данных, если доступна запрошенная строка.Обещанная рекурсивная функция не запускает оператор return

Для этого я использую un reccursive функцию, которая увеличивает число и проверяет ее на конкатенацию с моей пробитой строкой.

Пример:

  • Я хочу, чтобы вставить 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.

Я appriciate ваших помощи, ребята;)

EDIT: благодаря @Adam, код отредактировал

+0

в вашей 'функции findAvailable' вы не' 'return' с client.executeAsync (запрос) ... ' – Adam

+0

OMG какая глупая ошибка. Но добавление 'return' с' client.executeAsync (query) ... 'делает точно то же самое. –

ответ

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

Это то, что я только что сделал, благодаря Адаму. Но результат тот же. возврат не запускается. –

+0

WOW. Это работает ! http://data.whicdn.com/images/92550272/large.jpg Можете ли вы сказать мне, почему? –

Смежные вопросы