Понимание обещаний в узле JS? - PullRequest
0 голосов
/ 14 июня 2019

Я изучаю обещания в узле js. Я написал фрагмент кода, как показано ниже.

var request = require("request");
var userDetails;

function getData(url) {
    // Setting URL and headers for request
    var options = {
        url: url,
        headers: {
            'User-Agent': 'request'
        }
    };
    // Return new promise 
    return new Promise(function (resolve, reject) {
        // Do async job
        request.get(options, function (err, resp, body) {
            if (err) {
                reject(err);
            } else {
                resolve(body);
            }
        })
    })
}

var errHandler = function (err) {
    console.log(err);
}

function main() {
    var userProfileURL = "https://api.githshub.com/users/narenaryan";
    var dataPromise = getData(userProfileURL);
    // Get user details after that get followers from URL
    var whichPromise = dataPromise.then(JSON.parse)
        .then(function (result) {
            userDetails = result;
            // Do one more async operation here
            console.log("then1")
            var anotherPromise = getData(userDetails.followers_url).then(JSON.parse);
            return anotherPromise;
        })
        .then(function (data) {
            return data
        });
    console.log(whichPromise)

    whichPromise.then(function (result) {
        console.log("result is" + result)

    }).catch(function (error) {
        console.log("Catch" + error)
    });
}


main();

Теперь это работает просто отлично. У меня есть вопросы по этому поводу.

1.Как JSON.Parse может анализировать данные без получения строки json в аргументе.

var whichPromise = dataPromise.then(JSON.parse)

2.Если я указал неправильный URL-адрес в нижней строке

var userProfileURL = "https://api.githshub.com/users/narenaryan";

тогда блокировка не будет работать, потому что DNS не будет разрешен, и должно появиться сообщение об ошибке

 var anotherPromise = getData(userDetails.followers_url).then(JSON.parse);
            return anotherPromise;

не вернет никакого значения, а whichPromise не будет иметь никакой ссылки.

но если звоните ниже кода

whichPromise.then(function (result) {
        console.log("result is" + result)

    }).catch(function (error) {
        console.log("Catch" + error)
    });

здесь whichPromise может вызвать блок catch. может кто-нибудь объяснить почему?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

давайте попробуем понять это шаг за шагом.

1

=> dataPromise.then(JSON.parse)

Это равносильно записи

=> dataPromise.then(data => JSON.parse(data))

Поскольку JSON.parse - это метод, который принимает некоторые данные (строку) в качестве первого вводаи возвращает проанализированный JS-Object.Но в ясной картине это чистая функция.

Что во второй строке я сделал, чтобы очистить вашу концепцию, я передал анонимную функцию стрелки, которая также представляет arg (data) в качестве первого arg и возвращает то, что возвращает метод JS.parse ().Итак, мы создаем дополнительный слой или контекст выполнения.Этот дополнительный контекст называется «точка»

=> dataPromise.then(data => JSON.parse(data)) с дополнительным функциональным слоем

=> dataPromise.then(JSON.parse), переданный JSON.parse напрямую (arg => parsedObj)

Этот примерОфициальный словарь программного обеспечения называется «бессмысленное программирование».

1 голос
/ 14 июня 2019

Как JSON.Parse может анализировать данные без получения строки json в аргументе.

var whichPromise = dataPromise.then(JSON.parse)

.then() ожидает, что вы передадите ему функцию. Когда обещание разрешается, оно вызывает эту функцию и передает ему разрешенное значение обещания.

Итак, вы передаете ей функцию JSON.parse, а затем она вызовет эту функцию и передаст ей значение результата обещания, которым будет ваша строка JSON. Возвращаемое значение выполнения этой функции станет разрешенным значением результирующего обещания в цепочке. Итак, в вашем случае объект Javascript, который возвращает JSON.parse(), становится разрешенным значением вашей цепочки обещаний.

Если я введу неправильный URL в ...

Неправильный URL, очевидно, не приведет к получению нужных вам данных. В зависимости от неправильного URL-адреса, он либо создаст сетевую ошибку (такую ​​как ошибка DNS при разрешении хоста), либо выдаст ошибку 404 (такой путь отсутствует на этом хосте), либо сервер может вернуть ответ другого типа. То, что именно возвращается из request.get(), зависит от параметров, которые вы передаете request.get(), и от того, как URL неверен. В некоторых случаях обещание будет отклонено, и в этом случае ваш обработчик .then() не будет вызван. В других случаях обещание все еще может быть выполнено, но не будет данных или неправильный JSON, переданный в JSON.parse() В результате возникнет какая-то другая ошибка.

Важно понимать, что получение кода ответа 404 при отправке неверного пути с запросом http во многих библиотеках НЕ считается ошибкой http. Вы достигли сервера, отправили ему запрос, он обработал этот запрос и вернул вам ответ. Хотя ответом может быть код состояния 404, это не обязательно считается ошибкой. Таким образом, ваш собственный код должен либо сконфигурировать библиотеку http, которую вы используете, чтобы заставить 404 или любой 4xx быть ошибкой, либо вы должны явно проверить это, чтобы правильно обработать.

...