当每个呼叫都取决于之前的呼叫是否已完成时,我试图找到创建异步呼叫的最佳方法。目前,我通过递归调用定义的流程函数来链接方法,如下所示。
这就是我目前正在做的。
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。
有很多库和工具可以为您执行异步链接和控制流,它们主要有两个主要方面:
例如,请参见async,seq和step(基于回调)或Q和future(基于承诺)。这些方法的主要优点是它们只是普通的JS库,可减轻异步编程的麻烦。
以我个人的经验,基于承诺的库倾向于导致代码看起来更像通常的同步代码,因为您使用“返回”返回值,并且由于可以传递和存储承诺值,因此类似于真实值。
另一方面,基于连续的代码则级别较低,因为它显式地操纵代码路径。这可能可以允许更灵活的控制流以及与现有库的更好集成,但是也可能导致更多样板式和不太直观的代码。
扩展语言以添加对协程/生成器的本机支持,使您可以以非常直接的方式编写异步代码,并与其余语言配合使用,这意味着您可以使用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调用,然后进行更新