0

Есть код:

function ferd() {
   var terin;
   VK.Api.call('users.get', {user_ids: 210700286, fields: 'bdate'}, function(r) {
        if(r.response) {
           terin = r.response[0].bdate;
           alert(r.response[0].bdate);
        }
   }); 

   console.log(terin);
}

Появляется ошибка

TypeError: 'terin' of undefined

Как присвоить terin значение из VK.API

Так же при работе с массивом.

var terin = [];
function ferd() {
VK.Api.call('friends.get', {
 user_ids: id_vk, fields: 'uid,first_name'
}, function(data) {

    if (data.error) {
        console.log(data.error.error_msg);
    } else {

        if (data.response.length > 0) {
            for (i = 0; i < data.response.length; i++) {

               terin.push(data.response[i].user_id);

            }
        }
    }
});

}
Sonfire
  • 154

1 Answers1

0

переменная terin будет присвоена только в callback функции.

Один из вариантов использовать Promise для работы с асинхронными данными.

function ferd() {
    var terin = [],
        terinPr = new Promise(function(resolve, reject) {

        VK.Api.call('users.get', {user_ids: 210700286, fields: 'bdate'}, function(r) {
              if(r.response) {
              terin = r.response[0].bdat;
              alert(r.response[0].bdate);
              resolve(r);
          }
      }); 

    });

    terinPr.then(function (result) {
        console.log(result);
    })

}

Обновлено. Тестовый код с обещаниями:

function ferd() {
var terin = [],
    terinPr = new Promise(function(resolve, reject) {

    VK.Api.call('users.get', {user_ids: 210700286, fields: 'bdate'}, function(r) {
        if (data.error) {
            reject(data.error.error_msg);
        } else {
            resolve(data.response);
        }
  }); 

});

terinPr.then(function (response) {
   if (response.length > 0) {
            for (i = 0; i < response.length; i++) {
                terin.push(response[i].user_id);
            }
        }
});

}

Обновлено 23.02.17. вариант а калбэк функциями JQUERY:

    var terin = [];
var callbacks = $.Callbacks();
callbacks.add( setTerin );

function setTerin (response){
    for (i = 0; i < response.length; i++) {
        terin.push(response[i].user_id);
    }
    console.log(terin);
}

function ferd() {
        VK.Api.call('users.get', {user_ids: 210700286, fields: 'bdate'}, function(r) {
              if(r.response) {
              callbacks.fire( r.response );
           }
       }); 

}
  • Можно пример как присвоить? – Sonfire Feb 22 '17 at 14:07
  • Обновил пример. Там у вас r.response[0].bdat, а алерт r.response[0].bdate я посмотрите какой правильный – Kostiantyn Okhotnyk Feb 22 '17 at 14:13
  • А как быть с массивом? Добавил в шапку – Sonfire Feb 22 '17 at 14:17
  • Обновил тестовый пример. – Kostiantyn Okhotnyk Feb 22 '17 at 14:27
  • Мне массив terin нужно будет использовать в другом месте, это возможно? – Sonfire Feb 22 '17 at 14:44
  • Массив можно будет использовать только тогда, когда выполнится калбек в VK.Api.call. Вам придется либо проверять на пустоту terin, что не очень хорошо. Второй вариант создать своё событие и потом подписаться на него. Ну а третий вариант - построить работу в калбек функции промиса terinPr.then. – Kostiantyn Okhotnyk Feb 22 '17 at 14:54
  • Если будет интересно как c callback функциями работать могу тоже подсказать – Kostiantyn Okhotnyk Feb 22 '17 at 14:59
  • Обращаюсь к terin после VK.api, он пустой - Это меня не устраивает. Если в c# в асинхронном методе обратится к массиву/списку то он будет заполнен корректно – Sonfire Feb 22 '17 at 16:23
  • А response нормальный приходит? И где вы смотрели внутри калбек функции ? – Kostiantyn Okhotnyk Feb 23 '17 at 07:03
  • Добавил вариант с jQuery.Callbacks() – Kostiantyn Okhotnyk Feb 23 '17 at 07:11
  • jQuery.Callbacks() можно использовать только один? Так с двумя у меня уже не работает – Sonfire Feb 24 '17 at 12:08
  • Не совсем понял что не работает. var callbacks1 = $.Callbacks(); callbacks1.add( setTerin ); var callbacks2 = $.Callbacks(); callbacks2.add( setTerin2 ); – Kostiantyn Okhotnyk Feb 24 '17 at 12:09
  • и соответственно callbacks1.fire('data1') callbacks2.fire('data2') – Kostiantyn Okhotnyk Feb 24 '17 at 12:10
  • Работает только там callbacks.remove(setTerin); callbacks.add(setTerin1); Если создать callbacks1 то не работает – Sonfire Feb 24 '17 at 12:22
  • а, точно, надо очищать события – Kostiantyn Okhotnyk Feb 24 '17 at 12:26