javascript - Promise 函数需要使用 return 吗?

标签 javascript node.js promise

我正在尝试学习 pomise,我使用了在互联网上找到的代码......我不明白一切。它看起来对我来说非常令人讨厌,但它确实有效......

我初始化了promise

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之后放置return。是否可以重构代码而不返回?

  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 或将返回的body 到 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 (并从现在开始忽略错误情况),您将记录返回的降水量,但也会返回整个柏林天气 Node 的 Promise。这意味着您仍然可以执行以下操作:

f2('Berlin')

记录柏林的第一个降水量值,但现在返回一个有用的值,所以你可以这样做

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

进行相同的记录,然后记录整个柏林结果。

或者你也可以这样做

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

但现在请注意可用的清理。首先,f2 中的 rain 变量仅在下一行中使用,而 weather 变量只是对原始 的引用>结果 参数。所以我们可以这样简化:

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

如果您有疑问,我建议您在上述任何情况下返回。它使继续遵循值(value)观变得更加容易。

关于javascript - Promise 函数需要使用 return 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53265651/

相关文章:

javascript - 如何使用jquery仅从包含文本和图像的链接中删除文本?

javascript - Blogger 在 'html' 和 'compose' 模式之间切换时自动包含 href 标签

javascript - 每次读取数据 block 后等待 - Node JS

javascript - 我应该如何在JavaScript中“屈服”?

JavaScript promise 不与 resolve() 一起工作

javascript - 将已解析的 Promise 作为属性添加到对象

javascript - KnockoutJs - 如何将数据表与现有绑定(bind)表一起使用

javascript - 单击按钮时如何显示 hr

javascript - Webpack:多个 js 文件的单一作用域?

javascript - 获取 Node js服务器上特定时区的当前时间