2014-12-01 6 views
0

У меня есть этот один большой многофункциональный функции:Несколько функций в Node.js

function trans() { 
     var credentials = { 
      clientId: 'TurboFanTrans', 
      /* Client ID from the registered app */ 
      clientSecret: 'Gkqa2Ru37DeHAfR4AdH/sj94J5Ge1S8Ad7Spp89MMIs=' /* Client Secret from the registered app */ 
     }; 

     translator.detect(credentials, text, detectCb); 

     function detectCb(err, from) { 
      if (err) { 
       sendMain('error', err); 
       return; 
      } 

      translator.translate(credentials, text, from, lang, translateCb); 
     } 

     function translateCb(err, translated) { 
      if (err) { 
       sendMain('error', err); 
       return; 
      } 

      console.log(text + lang + "=>" + translated); 
     } 

    } 

Предположим, все объявленную, так как его многофункциональным, я делаю что-то неправильно, когда я звоню trans() здесь фрагмент кода :

case 'translate': 
         text += args[1]; 
         lang += args[2]; 
         trans(); 
         text = ""; 
         lang = ""; 
         break; 

При вызове, так как его все перепутались, text и lang возвращение как пустые строки (они изначально). Может ли кто-нибудь из вас, ребята, помочь мне разобраться в коде или в моем мозгу? конечным результатом должен быть переведенный текст text на языке чего-либо в lang. Заранее спасибо!

+0

Существует около 573 вещей, которые _could_ были неправильными в вашем коде или в службе, которую вы используете, но не видя полного кода, это трудно сказать. Можете ли вы добавить полный код к сути на Github или на jsfiddle? Первое, что я считаю проблематичным, это то, что значения переменных 'text' и' lang' определяются вне метода 'trans' и предполагается, что они существуют внутри. Но опять же, что-то еще, что могло произойти. – jakerella

+0

Это предложение, о котором вы сказали, вероятно, является проблемой, но вот полный код: http://pastebin.com/bTH99Q46 – Vikaton

+0

Sooo, это много кода. ;) Но, глядя на это снова, я думаю, что конкретная проблема заключается в том, что вы используете асинхронную службу (Bing?) Внутри функции 'trans()', что означает, что 'trans()' будет возвращать ** до ** перевод завершен, и в этот момент вы устанавливаете 'text' и' lang' в пустые строки. – jakerella

ответ

1

Причина в том, что trans() немедленно возвращается, потому что он не блокируется - он выполняет асинхронный запрос. Таким образом, text = ""; и lang = ""; выполнены перед вашими обратными вызовами в trans().

Простое решение этой проблемы является не использовать "глобальные" ценности и передать значения вместо:

case 'translate': 
    text += args[1]; 
    lang += args[2]; 
    trans(text, lang); 
    text = ""; 
    lang = ""; 
break; 

Затем измените:

function trans() { 

к:

function trans(text, lang) { 

Эти локальные переменные затем будут теневыми «глобальными».

+0

Спасибо! Это сделал трюк. – Vikaton

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