Функция обещания мне нужно использовать возврат? - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь научиться заражаться, и я использовал код, который нашел в Интернете ... Я не все понимаю.Это выглядит для меня очень неприятно, но это работает ...

Я инициализировал обещание

function initialize(city) {
    var options = {
        url: 'https://api.weatherbit.io/v2.0//forecast/',    
        headers: {
            'User-Agent': 'request'
        }
    };

    return new Promise(function(resolve, reject) {
        request.get(options, function(err, resp, body) {
            if (err) {
                reject(err);
            } else {
                resolve(JSON.parse(body));
            }
        })
    })
}

Я не понимаю, почему мне нужно поставить return после initializePromise.Возможно ли рефакторинг кода без возврата?

  var initializePromise = initialize("Berlin");
  return initializePromise.then(function(result) {
      weather = result;

      var rain = result["data"][0]["precip"];
      console.log(rain);

  }, function(err) {
      console.log(err);
  })

1 Ответ

0 голосов
/ 12 ноября 2018

Все зависит от того, что вы хотите сделать. Если вы написали эту версию, которая немного отличается от вашей оригинальной, но функционально такая же:

function f1(city) {
  return initialize(city).then(function(result) {
    const weather = result
    const rain = result["data"][0]["precip"];
    console.log(rain)
  }, function(err) {
    console.log(err)
  })
}

тогда при звонке

f1('Berlin')

вы бы запросили Berlin результат от сервера. Когда сервер ответит, вы либо передадите console.log ошибку, полученную из запроса, либо превратите возвращенное тело в объект JS, извлеките соответствующий precip свойство от него, и войти в консоль. Полученное значение Promise, возвращаемое из f1, бесполезно, а переменная weather не используется и не может использоваться.

Если вы хотите записать это количество осадков, но при этом сохранить полезное возвращаемое значение, вы можете написать:

function f2(city) {
  return initialize(city).then(function(result) {
    const weather = result
    const rain = result["data"][0]["precip"];
    console.log(rain)
    return weather  // *** NOTE new line here ***
  }, function(err) {
    console.log(err)
  })
}

На этот раз, позвонив с помощью Berlin (и с этого момента игнорируя регистр ошибок), вы зарегистрируете возвращенные осадки, но также вернете Обещание для всего берлинского погодного узла. Это означает, что вы все еще можете сделать это:

f2('Berlin')

, чтобы записать первое берлинское значение осадков, но теперь оно возвращает полезное значение, поэтому вы можете сделать

f2('Berlin').then(console.log)

, чтобы сделать ту же самую регистрацию, а затем записать весь берлинский результат.

Или вы могли бы сделать

f2('Berlin').then(function(weather) {
  // do something useful with `weather` here.
}, errorHandler)

Но теперь обратите внимание на доступную очистку. Прежде всего, переменная rain в f2 используется только в следующей строке, а переменная weather - это просто ссылка на исходный аргумент result. Таким образом, мы можем упростить это следующим образом:

function f3(city) {
  return initialize(city).then(function(result) {
    console.log(result["data"][0]["precip"])
    return result
  }, function(err) {
    console.log(err)
  })
}

Это делает то же самое проще. Но теперь есть гораздо более важное упрощение. Вполне возможно, что нам вообще не нужна эта функция! Если у нас есть какой-то обработчик ошибок (даже если это просто console.err), и у нас уже есть функция, которая выполняет большую часть обработки погоды, которую мы хотим, вместо

f3('Berlin').then(function(weather) {
  // do something useful with `weather` here.
}, errorHandler)

мы можем добавить строку регистрации из f3 в этот первый callbak и получить тот же результат, напрямую позвонив по initialize:

initialize('Berlin').then(function(weather) {
  console.log(weather["data"][0]["precip"])
  // do something useful with `weather` here.
}, errorHandler)

Причина, по которой это работает, заключается в том, что initialize возвращает s результат вызова then для Promise, а затем f2 и f3 также возвращают либо измененное значение, либо исходное значение. , сохраняя цепочку Promise в целости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...