当前位置: 首页 > 面试题库 >

在javascript中链接异步调用的正确方法是什么?

屈健柏
2023-03-14
问题内容

当每个呼叫都取决于之前的呼叫是否已完成时,我试图找到创建异步呼叫的最佳方法。目前,我通过递归调用定义的流程函数来链接方法,如下所示。

这就是我目前正在做的。

var syncProduct = (function() {
    var done, log;
    var IN_CAT = 1, IN_TITLES = 2, IN_BINS = 3;
    var state = IN_CAT;
    var processNext = function(data) {
        switch(state) {
            case IN_CAT:
                SVC.sendJsonRequest(url("/api/lineplan/categories"), processNext);
                state = IN_TITLES;
                break;
            case IN_TITLES:
                log((data ? data.length : "No") + " categories retrieved!");
                SVC.sendJsonRequest(url("/api/lineplan/titles"), processNext);
                state = IN_BINS;
                break;
            case IN_BINS:
                log((data ? data.length : "No") + " titles retrieved!");
                SVC.sendJsonRequest(url("/api/lineplan/bins"), processNext);
                state = IN_MAJOR;
                break;
            default:
                log((data ? data.length : "No") + " bins retrieved!");
                done();
                break;
        }
    }
    return {
        start: function(doneCB, logCB) {
            done = doneCB; log = logCB; state = IN_CAT;
            processNext();
        }
    }
})();

然后我将其称为如下

var log = function(message) {
    // Impl removed.
}

syncProduct.start(function() {
    log("Product Sync Complete!");
}, log);

虽然这对我来说非常好,但我不禁认为必须有一种更好(更简单)的方法。以后我的递归调用变得太深时,会发生什么?

注意 :我不是在浏览器中使用javascript,而是在Titanium框架中使用本机,这类似于Node.js的Javascript。


问题答案:

有很多库和工具可以为您执行异步链接和控制流,它们主要有两个主要方面:

  1. 控制流库

例如,请参见async,seq和step(基于回调)或Q和future(基于承诺)。这些方法的主要优点是它们只是普通的JS库,可减轻异步编程的麻烦。

以我个人的经验,基于承诺的库倾向于导致代码看起来更像通常的同步代码,因为您使用“返回”返回值,并且由于可以传递和存储承诺值,因此类似于真实值。

另一方面,基于连续的代码则级别较低,因为它显式地操纵代码路径。这可能可以允许更灵活的控制流以及与现有库的更好集成,但是也可能导致更多样板式和不太直观的代码。

  1. Javascript CPS编译器

扩展语言以添加对协程/生成器的本机支持,使您可以以非常直接的方式编写异步代码,并与其余语言配合使用,这意味着您可以使用Javascript
if语句,循环等,而无需使用函数复制它们。这也意味着将以前的同步代码转换为异步版本非常容易。但是,有一个明显的缺点,即并非每个浏览器都将运行您的Javascript扩展,因此您将需要在构建过程中添加一个编译步骤,以将代码转换为具有延续传递样式的回调的常规JS。无论如何,一种有前途的替代方法是Ecmascript
6规范中的生成器-
虽然到目前为止,只有Firefox本身支持它们,但仍有一些项目,例如regenerator和Traceur将其编译回回调。还有其他项目创建自己的异步语法(因为es6生成器当时还没有出现)。在此类别中,您将找到诸如tamejs和Iced
Coffeescript之类的东西。最后,如果您使用Node.js,也可以看看Fibers。


我的建议:

如果您只希望简单的东西不会使您的构建过程复杂化,那么我建议您使用最适合您的个人风格和已经使用的库的控制流库。

但是,如果您希望编写许多复杂且深度集成的异步代码,则强烈建议至少考虑使用基于编译器的替代方法。



 类似资料:
  • null my Library的核心逻辑 客户将使用我们的库,他们将通过传递builder对象来调用它。然后,我们将通过使用对象构造一个URL,并通过执行该对象对该URL进行HTTP客户端调用,在将响应作为JSON字符串返回后,我们将通过创建对象将该JSON字符串按原样发送给客户。有些客户会调用,有些可能会调用方法,所以我需要在库中分别提供两个方法。 接口: 您将如何实现同步和异步方法给定上述标准

  • 关于SpringWebFlux的小问题,以及如何“链接”http调用。 通过一个具体的例子,这里是一个非常简单的SpringMVC示例,带有一个rest模板。 在这个片段中,我们看到了非常简单的内容。仅初始化一个rest模板。 超文本传输协议请求有效载荷对象的构造。 使用所构建的对象来查询第一外部web应用API以获得响应。 重要的是,需要第一个HTTP调用的响应来进行第二个HTTP调用。它们只能

  • 那么,回到问题上来,鉴于微软建议不要在新的开发中使用WebRequest而是使用只提供异步API的HttpClient,我该怎么办呢? 这是我正在做的一些伪代码... 如何实现ProcessStuff()?

  • 本文向大家介绍超链接怎么正确调用javascript函数,包括了超链接怎么正确调用javascript函数的使用技巧和注意事项,需要的朋友参考一下 点击超链接调用 JavaScript 函数,一般人都用: 但这有个缺点,就是点击链接后,页面上的GIF动画将静止。 试看如下代码: 解决方法探讨: 此时不影响动画显示,但鼠标移上去后,鼠标及超链接样式不发生变化,虽然可以利用样式表来改变鼠标及超链接样式

  • 问题内容: 我最近从Angular转到了ReactJs。我正在使用jQuery进行API调用。我有一个API,该API返回要打印在列表中的随机用户列表。 我不确定如何编写我的API调用。最佳做法是什么? 我尝试了以下操作,但未得到任何输出。如果需要,我愿意实现替代API库。 下面是我的代码: 问题答案: 在这种情况下,您可以在中进行ajax调用,然后进行更新