LINUX.ORG.RU

Как нормально написать такой код на javascript?

 


0

1

Хочу написать функцию которая делает запрос к vk api и возвращает данные пользователей по списку id пользователей. На данный момент существует данный (рабочий) код :

function getAvatars(ids) {
      VK.api( "users.get", { uids : "'," + ids + ",'", fields : "uid, first_name, last_name, photo" }, function(data) {
           alert( JSON.stringify(data.response, null, 4) );
                
           // return ??
      });
}
Как мне вернуть data.response из getAvatars? Правильно ли вобще писать таким образом на javascript? Как нормально решить данную задачу?

★★

Проще всего вот так как-то

function getAvatars(ids) {
      VK.api( "users.get", { uids : "'," + ids + ",'", fields : "uid, first_name, last_name, photo" }, function(data) {
           global.data=JSON.stringify(data.response, null, 4)
      });
}
setTimeout(function(){doSmthngWithData(global.data)}, sometimout)
а ваще, от задачи, но смысл, думаю, ясен.

anonimous
()

Правильно ли вобще писать таким образом на javascript?

Правильно, я думаю, это неблокирующий асинхронный запрос, чтобы юзер не напрягался в ожидании ответа сервера, вполне в духе JS.

anonimous
()

Правильно в getAvatars передать вторым аргументом функцию и вызвать ее в месте где // return??, передав ей полученный результат. Ну или просто передать ее в api, не мутя вспомогательную функцию.

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 2)

Добро пожаловать в асинхронный мир JS.

В таких случаях используются колбеки.

Например, так:

function getAvatars(ids, cb) {
      VK.api( "users.get", { uids : "'," + ids + ",'", fields : "uid, first_name, last_name, photo" }, function(data) {
           cb(null, data.response);
      });
}

// в месте, где надо получить данные

getAvatars(ids, function(err, data) {
  alert(data);
});

Формат колбеков (err, result) это общепринятый CommonJS стандарт.

UPD.: никогда не делай так, как посоветовали в первом комментарии. Будет больно.

Y ★★
()
Последнее исправление: Y (всего исправлений: 1)
Ответ на: комментарий от anonimous

ты пол-года терзал лор своим нежеланием изучить предмет для того чтобы теперь советовать людям как не надо делать?

ТС: не слушай его. во-первых оно так и не вкурило что global в браузере по-умолчанию undefined, во-вторых - глобальные переменные зло, убедишься на двух параллельных вызовах getAvatars

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Ты спеси то поубавь. Я ему показал смысл происходящего. Дальше он сам додумается организовать свой код. А вы тут как мухи налетели, мля, типо покритиковать, по-факту, америку мля, открыл со своими каллбаками, типо умный, знаешь, епт, то что любой школьник знает, молодца. После коммента artpub, тред можно закрывать было, дальше цирк.

anonimous
()
Ответ на: комментарий от anonimous

Ты серьезно сказал большую глупость. Не думай пытаться доказывать что так и надо.

знаешь, епт, то что любой школьник знает

ТС не знает. Вот мы ему и говорим что нужно коллбеками

vertexua ★★★★★
()
Ответ на: комментарий от anonimous

Я просто в утреннем треде наворчаться успел, два раза в день не брюзжу.

arturpub ★★
()
Ответ на: комментарий от vertexua

Я ему показал, что происходит. Посыл был в том, что код выполняется асинхронно. Вопрос организации кода — это другой вопрос. И на колбеках, кстати, свет не сошелся.

anonimous
()
Ответ на: комментарий от vertexua

anonimous тоже не знает по-ходу. ниче, скоро уже 1-е сентября.

dib2 ★★★★★
()
Ответ на: комментарий от anonimous

Я ему показал, что происходит.

ты показал неработающий код, который использовать нельзя в принципе.

dib2 ★★★★★
()
Ответ на: комментарий от dib2

неработающий код

LOL я разводить дискуссию дальше не буду, ибо глупо. Остынь.

anonimous
()
Ответ на: комментарий от vertexua

Спорно. Изобрази мне коллбеками вот такую вот хрень. Любопытно взглянуть.

getData(server){
   getFrom("foo", server, response,  function(){
      arr.push(response)
   })
}
id=setInterval(function(){
if(arr.length===4) {showPorn(); clearTimeout(id)}
}, timeout)

getData(server1)
getData(server2)
getData(server3)
getData(server4)
Зависит все от задачи, имхо, где то коллбеками (наихудший по выразительности вариант), где-то промисами, где-то таймаутами. Он, кстати, и сам создатель ноды хотел одно время выпилить колбеки нахрен, только тут-же куча хомячья восстала: «ну как же, мы в колбеки уже умеем, мы илита, епт».

anonymous
()
Ответ на: комментарий от vertexua

Хз, мне кажется, это естественное решение для событийной модели — когда все ответы получены, событие выстреливает. Проще, мне кажется, ничего не придумаешь.

я че нетрезвый тут таймауты городить

Я не пойму, у тебя против таймаутов какое то принципиальное (пред)убеждение?

anonymous
()
Ответ на: комментарий от anonymous

Таймауты хороши для прерывания операций по истечению периода отсутсвия ответа. Это и есть «таймаут», которым стоит пользоватся и учитывать. А функция вызывания кода через время setTimeout обычно ни к чему хорошему не приводит и лучше ее держать глубоко в недрах отлаженых библиотек. two-way binding какого-то AngularJS с директивой условной операции в данном случае чище и проще

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Ну да, под каждую тривиальную фигню своя монструозная библиотека, это конечно проще. А внутри этой библиотеки те же самые тайтауты и интервалы, lol. Прямо unix-УАУ. Только потом юзер не понимает, мочему сайт грузится по полчаса и глючит потом. Думает, что билл гейтс плохую ось сделал.

anonymous
()
Ответ на: комментарий от anonymous

Почитай как они работают, сколько места занимают, какие конкретные накладные расходы. Ну и если интерестно, что такое WebComponents

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

эта задача прекрасно решается с помощью promises (Q например). и тайм-ауты, и обработка ошибок - все будет из коробки (вообще тайм-ауты будут моветоном, если ошибки обрабатываются, у клиентов элементарно может быть скорость соединения не позволяющая выполнить заданные вручную тайм-ауты. лучше такие вещи доверять браузеру)

dib2 ★★★★★
()
Ответ на: комментарий от anonymous

билл гейтс плохую ось сделал

Блин, а я то думаю, почему у меня сайт грузится и глючит.

Теперь знаю кто виноват.

* Учитывая, что сервер фурычит скорее всего под лялей или фряхой выводы напрашиваются совсем другие.

Deleted
()
Ответ на: комментарий от Deleted

Учитывая, что сервер фурычит скорее всего под лялей или фряхой выводы напрашиваются совсем другие.

На современных сайтах глючит и тормозит частенько именно «жирный» яваскрипт на клиенте

mio ★★
() автор топика
Ответ на: комментарий от anonymous

А так чем плохо?

var finishedCalls = 0;

asynchronousCall(param1, onSomeCallFinished);
asynchronousCall(param2, onSomeCallFinished);
asynchronousCall(param3, onSomeCallFinished);
asynchronousCall(param4, onSomeCallFinished);

function onSomeCallFinished () {
	finishedCalls++;
	if (finishedCalls == 4)
		onAllCallsFinished();
}

function onAllCallsFinished () {
	// ...
}

Коллбэки конечно имеют свойство быстро превращаться в нечитаемую лапшу, но это не тот случай.

Kalashnikov ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.