在使用承诺时如何思考

时间:2014-03-03 13:32:22

标签: javascript asynchronous promise

我第一次使用异步编程,特别是Javascript中的promises,我真的很困惑。我仍然在思考我们在C,PHP,C#等等所做的每一步,下一个步骤可以确定它的完成。这很容易,因为如果我们有这样的代码(例如在C#中)

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

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

现在,在带有承诺的JS中,我们会有类似

的东西
var pages = dataService.getPages();

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

那么当我们处理这些事情时,我们该怎么想?是否有一些教程或一些视频详细说明如何使用JS中的promise进行异步编程?

2 个答案:

答案 0 :(得分:3)

  

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

你不需要。

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

  

那么当我们处理这些事情时,我们如何思考?

思考functional

程序中的每个任务都应该明确且仅取决于其输入。函数应该尝试仅使用其参数,而不是任何包含state的全局变量。

  

是否有一些教程或一些视频详细说明如何使用JS中的promise进行异步编程?

Q库维基中的

General Promise Resources是一个非常好的开始。

答案 1 :(得分:0)

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

但是,不能使用'await'运算符,对promise的'then'函数类似于使用'ContinueWith'链接C#中的Tasks。

回调可能会在范围内变得复杂,特别是在广泛使用嵌套匿名函数时,所以请给出承诺