Javascript异步成功函数-互斥
Javascript Asynchronous success function - mutex
考虑以下情况:
为了在后台处理大量工作,我将数据发送到接口,然后等待返回结果数据。因此ajax调用非常完美。由于不知道结果是按什么顺序接收的,并且我需要在之前按特定顺序显示结果,如果所有发送的任务都正确返回,我将只调用一个函数。这可以通过一个简单的(减少的,不完全是)信号量变量来完成,该变量计算发送了多少任务。
var tasks = 0;
do {
// things to prepare
tasks++;
$.post("foo.php",data, function(data) {
tasks--;
foo(data);
});
}while(thereIsMore);
foo(data) {
// push data to array
// sort the array
if(tasks == 0)
processResults(array);
}
Javascript被调用为单任务,而不是多任务。我说得对吗?在访问数组和任务计数器时,不可能存在任何互斥的情况,因为这永远不会发生?我对异步行为有点困惑,可能会想到可以给出比赛情况的场景?
一个例子(以及我的理解):
3在很短的时间内发送和接收的任务。因此,所有响应都是在一种调度类型中处理的。任务1已检查(如果任务==0),并且为false。任务2在检查任务之前暂停一条指令,任务3现在作为成功处理程序执行。任务3现在递减任务,其值为0。任务3暂停,任务2恢复。任务2检查是否(任务==0),是的。。它是零。它开始处理,但并非所有数据都在数组中并进行排序。
我对你的意见或知识很感兴趣,如果这完全是疯狂的,那是不可能发生的。请分享您的知识:-)
一次只运行一个ajax响应函数,它将在下一个函数运行之前运行完成。您不必担心同时访问javascript变量——这是不可能的。浏览器中的Javascript是真正的单线程(除了Web Workers,但这不是我们在这里讨论的内容)。
Javascript使用事件队列。当像ajax调用这样的异步操作完成时,它会在事件队列中放入一个条目。如果当前没有javascript正在执行,则会立即触发该事件(并调用ajax回调)。如果某个javascript当前正在执行,它就会继续执行。当javascript完成一个执行线程时,它会检查事件队列中是否还有其他东西在等待。如果有,它将处理该事件。这与鼠标事件、键盘事件、计时器事件、ajax完成事件等的工作方式相同。
只有当当前执行线程完成时,才会处理下一个事件。
如果您想知道所有ajax调用何时完成,您只需像示例代码中一样,统计到目前为止完成了多少ajax调用。在每个完成函数中,您可以更改完成计数并比较其值,以查看是否全部完成。如果数字表示所有操作都已完成,则可以执行最终操作。如果它们还没有全部完成,那么您将存储数据,而不执行任何其他操作,因为最后一个成功处理程序将看到它们已经全部完成,并启动您的最终操作。
您也可以只使用带有延迟的JQuery的"when()"方法。
或者,Undercore的"after()"函数。
这两种方法都提供了一种非常简单的方法来跟踪何时返回了大量异步请求。
javascript中永远不会出现这样的比赛条件。javascript中有一个叫做Run to Completion的东西,它确保如果一个代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此不会出现并发问题。
有关更多详细信息,请参阅javascript中为什么没有并发控制工具。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- Javascript异步成功函数-互斥