2016-12-18 2 views
0

Я новичок в JavaScript и NodeJS, и мне нужно быстро решить эту проблему.Как получить доступ к объекту, созданному в функции от другой функции

 connection(getSQL2) 
    .then((table)=> { 
     table.forEach(row=> { 
      let obj = { 
       countryid: row.IdPais, 
       country: row.NombrePais 
      }; 
      data.push(obj); 
      }); 

     }); 

console.log(obj); 

Когда я пытаюсь отобразить объект с помощью console.log, я получаю undefined, что кажется довольно очевидным. Но что было бы простым способом заставить его отобразить объект «obj», который был создан выше?

UPDATE: Для уточнения, console.log используется здесь только в качестве примера. Мне нужно получить доступ к объекту снаружи этой функции, но я могу.

Заранее благодарен!

+0

Переместите вызов console.log внутри обратного вызова, где вы определили 'obj'. –

+0

Я просто поместил console.log на улицу, чтобы было ясно, что мне нужно получить доступ к объекту снаружи. Мне нужно получить некоторые данные из этого объекта в какой-то другой функции. Как будто это глобальная переменная. Спасибо в любом случае. –

+0

попробуйте утешительные 'данные', это будет определено за пределами – anwerj

ответ

0

Две вещи здесь.

1) Вы используете обещание и обещаете асинхронно разрешать. Хорошее эмпирическое правило - любой код, который заканчивается .then(...), будет обещанием. Это означает, что код под ним может выполняться до того, как обещание будет закончено, и если он прочитает эти значения до того, как обещание закончит разрешение, они будут считаны как undefined.

2) Вы используете let ключевое слово, чтобы определить переменную, которая означает, что она будет определена только в области:

row => { 
      let obj = { 
       countryid: row.IdPais, 
       country: row.NombrePais 
      }; 
      data.push(obj); 

      // Show the object where it is defined 
      console.log(obj); 
      } 
+0

В этом случае это работает, но console.log - это не совсем то, что мне нужно. Мне нужно получить доступ к объекту, как если бы это была глобальная переменная из другой функции. Спасибо в любом случае. –

+0

У вас нет доступа к этому в массиве 'data'? – Mike

+0

Только внутри функции стрелки. –

0

Вы должны сделать это: -

async database() 
{ 

     try { 
      const table= await connection(getSQL2); 
      if (table!== null) 
      { 
      table.forEach(row=> { 
       let obj = { 
          countryid: row.IdPais, 
          country: row.NombrePais 
         }; 
      console.log('This will resolve the promise',obj); 
      } 
      else 
      { 
      //anything needed 
      } 
      } 
      catch (error) 
      { 
         // Error retrieving data 
      } 
} 

async и await являются ключевыми словами, которые используются параллельно. Ключевое слово await не позволит управлению спускаться до тех пор, пока не будут получены данные.

+0

Спасибо за ваш ответ. Я думаю, что это будет правильный путь. Но я получаю это: асинхронной базы данных() { ^^^^^^^^ SyntaxError: Неожиданный идентификатор –

+0

Я попробовал этот подход, были решены мои вопросы, и его правильный путь разрешения обещания. вы используете эту функцию в узле? – Codesingh

+0

Я использую Node 7.1.0 для импорта некоторых таблиц SQL в коллекции MongoDB. –

0

вы можете создать global variable и присвоить значение этой переменной внутри этой функции.

Тогда вы также сможете получить доступ к переменной obj вне функции.

var temp;//declare a global variable here. 
connection(getSQL2) 
.then((table)=> { 
    table.forEach(row=> { 
     let obj = { 
      countryid: row.IdPais, 
      country: row.NombrePais 
     }; 
     data.push(obj); 
     temp = obj;//assign value to global variable here 
     }); 

    }); 

console.log(temp);//you can access the 'obj' using temp 

Надеюсь, это вам поможет.

+0

К сожалению нет. Все еще не определено. –

+0

Извините, вам нужно сделать 'console.log (temp)', я отредактирую свой ответ. –

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