mr_qpdb
@mr_qpdb
⏱ - is not eternal

Как объдинить объект JS?

Доброго времени суток.

Пытаюсь получить полный список своих друзей таким запросом:

https://api.vk.com/method/friends.get?count=${$count}&offset=${$offset}&fields=${$fields}&access_token=${$token}&v=5.103


Но у них есть одно "но", и заключается она в том, что максимально можно вернуть 5к, поэтому использую offset.

Так вот, мне надо получить 10к друзей, и другого способа, кроме как использовать ajax, мне в голову ничего не пришло.

Поэтому прошу Вас о помощи.

Ниже код, но Вы можете написать свое решение с кодом, потому что я думаю, что это не идеальное решение.

Код:

let alles1 = $.ajax({
    url: `https://api.vk.com/method/friends.get?count=${$count}&offset=${$offset}&fields=${$fields}&access_token=${$token}&v=5.103`,
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: async (data) => {
        return await data
    }
})
let alles2 = $.ajax({
    url: `https://api.vk.com/method/friends.get?count=${$count}&offset=${$offset2}&fields=${$fields}&access_token=${$token}&v=5.103`,
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: async (data) => {
        return await data
    }
})


Если, это все дерьмо вывести в консоль, то получаем два response объекта.

Тут пришло в голову объединить эти объекты методом Object.assign(), да, этот метод объединяет, но с*ка ЗАМЕНЯЕТ ключи объекта.

Как получить все 10к друзей, если есть другой способ?
Или как объединить эти объекты без ЗАМЕНЫ ключа?
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
mr_qpdb
@mr_qpdb Автор вопроса
⏱ - is not eternal
Спасибо всем за ответы, и особенно Сергею Соколову.

Решение:

let alles1 = await $.ajax({
    url: `https://api.vk.com/method/friends.get?count=${$count}&offset=${$offset}&fields=${$fields}&access_token=${$token}&v=5.103`,
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: async (data) => {
        return await data
    }
})
let alles2 = await $.ajax({
    url: `https://api.vk.com/method/friends.get?count=${$count}&offset=${$offset2}&fields=${$fields}&access_token=${$token}&v=5.103`,
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: async (data) => {
        return await data
    }
})
const alles = alles1.response.items.concat(alles2.response.items)
console.log(alles)


Надо было просто дописать await везде, где это было нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
iiiBird
@iiiBird
Пока ты спишь - твой конкурент совершенствуется
используй https://vk.com/dev/execute
в code пиши, что то типа этого:
var members = API.friends.get({
	"count": 5000,
	"fields": "photo_max",
	"offset": 0,
	"v": 5.103
}).items;

members = members + API.friends.get({
	"count": 5000,
	"fields": "photo_max",
	"offset": 5000,
	"v": 5.103
}).items;

return members;
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Лучше за один запрос всё получить через метод ВК execute() — он позволяет выполнить несложный код, на похожем на JS языке, на стороне сервера ВК:
const code = `
var offset = 0;
var step = 5000;
var result = API.friends.get({"offset":offset, "count":step});
var friends = result.items;
var total = result.count;
while(friends.length < total) {
  offset = offset + step;
  friends = friends + API.friends.get({
    "offset": offset,
    "count": step,
  }).items;
}
return friends;
`;

new Promise((res, rej) => {
  $.ajax({
    url: 'https://api.vk.com/method/execute',
    method: 'POST',
    data: {
      code: code,
      v: '5.103',
      access_token: 'SECRET',
    },
    success: data => res(data),
    error: err => rej(err),
  });
}).then(data => {
  console.log('Все друзья:', data);
})
.catch(err => console.error(err));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы