【问题标题】:Turn callback to promise and using of `await` [closed]将回调转为承诺并使用`await` [关闭]
【发布时间】:2021-03-08 04:56:01
【问题描述】:

我找到了这个示例 sn-ps in this article
<script>
    async function get_data() { // async function
        await $.get('https://url.com/one')
        await $.get('https://url.com/two')
        let res = await $.get('https://url.com/three')
        console.log(res)
    }
</script>

承诺的版本是:

<script>
    function get_data() {
        $.get('https://url.com/one', () => {
            $.get('https://url.com/two', () => {
                $.get('https://url.com/three', (res) => {
                    console.log(res)
                })
            })
        })
    }
</script>

我的问题是,在承诺的版本中,我们可以将await $.get('https://url.com/one') 变成<strike>await</strike> $.get('https://url.com/one'),因为它是第一个承诺吗?
如果是,为什么两者中的任何一个都被视为最佳实践?
先感谢您

【问题讨论】:

  • 不,你不能删除等待,如果你删除等待,那么函数将返回一个未解决的承诺
  • await 让承诺等到它解决。没有它,它将启动请求并继续下一行而无需等待

标签: javascript node.js async-await ecmascript-2017


【解决方案1】:

如果您希望在 url.com/one 完成后运行对 url.com/two 的调用,则必须等待返回的承诺。但是,如果您希望所有这些都同时运行,您可以删除等待,并将 2 个承诺传递给您可以等待的 Promise.all([promise1,promise2, promise3])

【讨论】:

    【解决方案2】:
    1. 如果您删除 await,它不会等待 promise 的 resolve 或 reject 响应。

    2. 它的作用是跳过线程中的表达式并继续获取第二个响应。

    3. 第一个 sn-p 是最佳实践,因为您将得到代码的回调地狱。想想你需要发送 20 个请求并考虑回调的页面。没有人能理解什么请求是从哪里发出的。因此,使用 Promises,您可以等待或跳过任务(如果您跳过,它将在后台运行)。因此代码结构的层次结构不会改变。另一个问题是当您需要将响应返回给变量时。你需要把这样的结构。

      <script>
      function get_data() {
          let res = $.get('https://url.com/one', () => {
              return $.get('https://url.com/two', () => {
                  return $.get('https://url.com/three', (res) => {
                      console.log(res)
                      return res;
                 })
              })
          })
      }
      </script>
      

    【讨论】:

    • 在这种情况下我们不应该使用.then( 方法吗?
    • 如果你不在回调地狱中,你可以使用then。
    猜你喜欢
    • 2018-05-04
    • 2016-02-02
    • 2016-11-10
    • 2018-08-08
    • 1970-01-01
    • 2019-01-16
    • 2014-06-21
    • 2020-06-02
    • 2016-06-15
    相关资源
    最近更新 更多