我需要使用Promise函数使用return吗?

时间:2018-11-12 15:50:51

标签: javascript node.js promise

我正在尝试学习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);
  })

1 个答案:

答案 0 :(得分:1)

这一切都取决于您要做什么。如果您编写的是此版本,该版本与原始版本略有不同,但在功能上是相同的:

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进行调用(并且从现在开始忽略错误情况),您将记录返回的降水量,但还会返回整个柏林天气节点的Promise。这意味着您仍然可以这样做:

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 返回是在Promise上调用then的结果,然后依次是f2f3返回更改后的值或原始值,并保持Promise链完整。

我建议,如果您有任何疑问,请在上述任何一种情况下退货。这样可以更轻松地继续使用值。