http://kholodnyak.ru/shri/africa-population
Скрипт имеет несколько проблем:
-
Проблема: В функции
callback
отсутствует переменнаяrequest
. Когда функция вызывается, она берёт это переменную из внешнего LexicalEnvironment. На момент выполнения передаваемого вgetData()
коллбэка внешний цикл уже завершился => последнее значение переменнойresponse == '/populations'
. В результате все переданные вgetData()
коллбэки будут использовать одно и то же значение response (== '/populations'
), поэтому результат выполнения отличается от ожидаемого.Решение: Исправить код можно, "поймав" текущее значение
response
с помощью дополнительной внешней функции (в нейresponse
является аргументом). В своей реализации я назвал эту функциюcallbackGenerator
.var callback = (function (request) { // Далее идёт изначальный код из условия. return function (error, result) { responses[request] = result; ... }; })(request);
Остальные ошибки и неточности не влияют на выполнение исходного кода, но их всё равно желательно исправить.
-
Если использовать переменную без объявления через
var
, она попадет в глобальную область видимости (добавляется свойством в объектwindow
/global
/etc.) или выдаст ReferenceError вstrict mode
. Необходимо всегда объявлять переменные с помощьюvar
/let
(ES6) -
Нет обработки переданной в коллбэк ошибки.
function (error, result) { ... }
-
В функции
getData()
при вызовеsetTimeout()
вторым параметром передаетсяNaN
. Исправить можно, добавив скобки функцииMath.random()
. -
Неинтуитивные имена переменных, магические цифры, большая вложенность, именование констант lowercase, отсутствие декомпозиции.
Существует API, которое умеет отвечать по трём URL: /countries
, /cities
и /populations
.
Клиентское приложение подсчитывает численность населения в Африке. Запросы друг от друга не зависят.
Чтобы браузер пользователя не простаивал, клиентскому приложению важно уметь делать все три запроса одновременно.
Реализацией API является функция getData(url, callback)
, которая принимает строку с URL запроса и функцию обратного вызова.
В случае ошибки в callback
первым аргументом будет передана строка ошибки, в случае успеха вторым аргументом будет передан ответ API.
Вам досталась реализация клиентского приложения, которое должно решать описанную выше задачу. Но в коде приложения есть ошибки, из-за которых фактический результат работы отличается от ожидаемого.
Как должно быть: приложение выводит в консоль суммарную популяцию в Африке. Как на самом деле: приложение не выводит в консоль ничего.