![](/img/trans.png)
[英]Why i need to use return keyword in this function so the promise work correctly?
[英]Promise function do I need use return?
我正在嘗試學習Pomise,並且使用了在Internet上找到的代碼...我不了解所有內容。 它看起來很討厭,但有效...
我初始化了諾言
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));
}
})
})
}
我不明白為什么需要在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);
})
這一切都取決於您要做什么。 如果您編寫了此版本,該版本與原始版本略有不同,但在功能上相同:
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
屬性,並記錄到控制台。 從f1
返回的結果Promise
值是無用的,並且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)
但是現在請注意可用的清理。 首先, f2
的rain
變量僅在下一行使用,而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鏈完整。
我建議如果您有任何疑問,請在上述任何一種情況下退貨。 這使得繼續使用值變得容易得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.