簡體   English   中英

我需要使用Promise函數使用return嗎?

[英]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)

但是現在請注意可用的清理。 首先, f2rain變量僅在下一行使用,而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上調用的結果,然后f2f3還返回更改后的值或原始值,從而保持Promise鏈完整。

我建議如果您有任何疑問,請在上述任何一種情況下退貨。 這使得繼續使用值變得容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM