【问题标题】:How to think when working with promises使用 Promise 时如何思考
【发布时间】:2016-08-13 00:19:00
【问题描述】:

我第一次使用异步编程,特别是 Javascript 中的 Promise,我真的很困惑。我仍然在想我们在 C、PHP、C# 等中所做的那样,对于每一步,下一步都可以确定它已经完成。这很容易工作,因为如果我们有这样的代码(例如在 C# 中)

IEnumerable<Page> pages = pagesRepository.getAll();

我们可以在下一行确定所有页面可供我们在pages 对象中使用。这让生活更轻松,因为我们已经可以正确处理这些数据了。

现在,在带有 Promise 的 JS 中,我们会有类似的东西

var pages = dataService.getPages();

这不会返回数据,而只是一个非常不同的承诺。当然,我们可以使用then 添加回调,但我很困惑,因为在我的代码中的其他地方我可能需要引用这个变量,我无法确定何时调用回调。

那么当我们处理这些事情时,我们是怎么想的呢?是否有一些教程或视频详细展示了如何在 JS 中使用 Promise 进行异步编程?

【问题讨论】:

  • > 在我的代码中的其他地方我可能需要引用这个变量,我不能确定什么时候会调用回调。为什么不?回调可以更改全局变量,例如 ... data_service_last-update
  • 我明白你的意思。异步编程不是你可以在几个小时内学会的。您必须以异步方式思考您的代码,即使函数仅在回调时执行,或者让它们在每次执行时检查所需的值。就像开始在 OOP 中编码一样深...
  • @MaxArt,您知道如何开始使用异步编程的视频课程、书籍和教程等优质资源吗?谢谢。

标签: javascript asynchronous promise


【解决方案1】:

当然我们可以用 then 添加一个回调,但是我很困惑,因为在我的代码中的其他地方我可能需要引用这个变量,我不能确定什么时候会调用回调。

你不需要。

“其他地方的代码”将使用.then() 并为其结果产生一个新的承诺,依赖于pages 承诺。您可以轻松地映射结果,或链接其他异步任务。每当您因为多个依赖项而需要了解回调的时间时,您应该使用您的库的方法来编写 Promise,例如 all()

那么当我们处理这些事情时,我们是怎么想的呢?

想想functional

程序中的每个任务都应该明确地并且只依赖于它的输入。一个函数应该尽量只使用它的参数,而不是任何包含状态的全局变量。

是否有一些教程或视频详细展示了如何在 JS 中使用 Promise 进行异步编程?

在Q库的wiki中General Promise Resources是一个很好的开始。

【讨论】:

    【解决方案2】:

    这里的简单答案是,promise 类似于 C# 中的 Task 异步编程。

    但是,promise 上的“then”函数不能使用“await”运算符,而是类似于在 C# 中使用“ContinueWith”链接任务。

    跨范围使用回调可能会变得复杂,尤其是在大量使用嵌套匿名函数的情况下,所以请尝试一下 Promise

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多