Все зависит от того, что вы хотите сделать. Если вы написали эту версию, которая немного отличается от вашей оригинальной, но функционально такая же:
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 в целости.
Я бы предложил, чтобы в случае сомнений вы что-то возвращали в любой из этих ситуаций. Намного легче продолжать работу со значениями.