当前位置:首页 > 日记 > 正文

javascript队列函数与异步执行详细解决方案

javascript队列函数与异步执行详细解决方案
编者注:在回顾的Javascript代码中,已经看到了类似的队列函数,在阅读本文之后,发现它也可以用于异步执行。

假设你有几个功能FN1、FN2、FN3,需要为了所谓的。当然,最简单的方法是:

(FN1);
(FN2);
(3);
但有时这些函数是一个接一个地添加操作的,调用的时间不知道什么功能;此时您可以预先定义一个数组,当在推送中添加一个函数时,当您需要从数组中取出一个接一个的函数,以便调用:

var堆栈{ };
/ /执行其他操作的定义,FN1
Stack.push(FN1);
/ /执行其他操作的定义,FN2、FN3
Stack.push(FN2、FN3);
呼叫/时间
stack.foreach(功能(Fn){ fn()});
这样的函数没有名称,也不重要,它可以直接通过匿名函数进行测试:

var堆栈{ };
功能FN1(){
console.log(第一个电话);
}
Stack.push(FN1);

功能Fn2(){
console.log(第二电话);
}
Stack.push(FN2,函数(){ console.log(‘三称)});

stack.foreach(功能(Fn){(FN)}); / /输出序列的第一个电话和第二呼叫和第三电话
这个实现通常工作到目前为止,但是我们忽略了一个例子,异步函数的调用。这里不讨论Javascript中异步的各种术语和概念。请自己读(例如,一个著名的注释)。如果你知道下面的代码将输出1, 3和2,继续往下看:

(1)console.log;

setTimeout(){()函数(
(2)console.log;
},0);

(3)console.log;

如果堆栈队列具有类似的函数函数是异步的,那么我们的实现就会一团糟:

var堆栈{ };

功能FN1(){ console.log(第一个电话)};
Stack.push(FN1);

功能Fn2(){
setTimeout(function(){ fn2timeout)
console.log(第二电话);
},0);
}
Stack.push(FN2,函数(){ console.log(‘三称)});

stack.foreach(功能(Fn){(FN)}); / /输出的第一个电话和第三电话和第二呼叫

显然,FN2是为了呼吁,但是setTimeout(fn2timeout){ console.log(第二呼叫)}不立即执行(即使超时设置为0 FN2);调用后立即返回,然后FN3实施、FN3执行这真的是fn2timeout后。
如何解决在我们的分析中,这里的关键是fn2timeout,我们要等到它真的结束了叫FN3,理想像这样:

功能Fn2(){
setTimeout(){()函数(
fn2timeout();
(3);
},0);
}
但这是相当于一个新的函数代替原来的fn2timeout,插入原fn2timeout和FN3进去。这对原函数的动态版本有一个专用的名词叫猴子补丁。根据我们的程序员的口头禅:这是一定要做的,但它是一个小拧和容易去。有没有更好的办法吗

我们退一步,我们没有强制执行的fn2timeout FN3完全在fn2timeout函数体的最后一行被称为。

功能Fn2(){
setTimeout(function(){ fn2timeout)
console.log(第二电话);
FN3({ 1 }); / /注
},0);
}
它看起来好一点,但没有FN3当你定义FN2、FN3,是吗

另一个问题是,在FN2,如果你想打电话给FN3,我们不能通过电话stack.foreach FN3,否则FN3将重复调用两次。

我们不能在FN2写FN3。相反,我们只需要在fn2timeout最终找到堆栈氮气分压下功能,又叫它:

功能Fn2(){
setTimeout(function(){ fn2timeout)
console.log(第二电话);
下一步();
},0);
}
下一个函数负责查找堆栈中的下一个函数并执行它:

var指数= 0;

函数下一步(){
堆栈= { };
索引= 1;事实上,也可以使用移位来连接
如果(类)FN(FN = 'function);
}

下一步得到堆栈中的函数,{ },每次调用一次,索引增加1,以达到提取下一个函数的目的。

下一个使用这个:

var堆栈{ };

索引的定义和下一步

功能FN1(){
console.log(第一个电话);
(下一步);每个堆栈函数必须称为下一个。
};
Stack.push(FN1);

功能Fn2(){
setTimeout(function(){ fn2timeout)
console.log(第二电话);
下一步(下一步);
},0);
}
Stack.push(FN2,函数(){(){
console.log(‘三通话);
(下一步);最后一个不能调用,调用也无用。
});

下一个(下一个)调用;最终输出序列第一次调用和第二次调用和第三调用。

现在stack.foreach线已被删除。我们下一次打电话。我们会发现第一个函数在执行堆栈,FN1,FN1要求下,找到下一个功能Fn2并执行它,然后再调用FN2,等等。下一个

每个函数都必须调用下一个函数。如果一个函数没有被写入,程序将在函数执行后直接结束,并且没有机制继续。

在了解函数队列的实现之后,您应该能够解决下面的面试问题:

/ /傻大锅的实现,可以称为以下方式:
LazyMan(Hank)
输出:
你好!我是Hank。
* /

LazyMan(Hank),睡眠(10)吃(晚餐)输出。
输出:
你好!我是Hank。
等待10秒。
10点后醒来
吃晚饭~
* /

LazyMan(Hank)。吃(晚餐)吃(晚餐)。
输出:
你好,我是Hank!
吃晚饭~
吃晚饭~
* /

LazyMan(Hank)。SleepFirst(5)吃(晚餐)。
继续等待5秒,输出
5点后醒来
你好,我是Hank!
吃晚饭
* /

等。

著名的连接框架在Node.js正是中间件队列实现。有趣的是看它的源代码或这样解释什么是连接中间件。
您可能会注意到,下一步只能暂时放在函数的结尾处。如果你把它放在中间,原来的问题就会出现。

函数FN(){
(1)console.log;
下一步();
console.log(2)(下); / /如果调用异步函数,console.log(2)将首先执行
}
Redux和KOA可以通过不同的实现放在函数中。在执行后面部分的功能之后,下一次执行代码将非常聪明。接下来是代码。有时间再写和写。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。

相关文章

AngularJS点击放大制作上传预览

AngularJS点击放大制作上传预览

上传,电脑软件,AngularJS,这个例子给你分享AngularJS点击具体代码的图片放大预览,供大家参考,详情如下 拿最后一篇文章 单击放大单击还原图片。 Angular.module('routermodule)。指令('enlargepic,函数(){ / / enlargepic指令名称写在你需要的地…

优化技能分享

优化技能分享

分享,优化,技能,电脑软件,有一天发现一个SQL内连接不是很慢(0.1-0.2),但它并没有达到理想的速度。两表关联,以及与之相关的字段是主键,和查询的字段是唯一指标。 SQL如下: 选择 p_item_token *, p_item.product_type 从 p_item_token 内部联接p_i…

PS图象处理软件图层样式制作好网页

PS图象处理软件图层样式制作好网页

网页,图层,图象,处理软件,样式,这是PS图象处理软件的一个按钮制作教程。在本教程中,我们将向您展示如何使用PS图象处理软件的图层样式功能创建三维效果按钮透明水晶。让我们一起做吧。 先看看效果吧。 1,新建文件,大小自,背景白,新建一层,画黑圆…

PS是如何产生3D岩石效果的字体和字

PS是如何产生3D岩石效果的字体和字

字符,字体,3D,效果,岩石,我们经常会看到一些很酷的海报或广告字体,这些字体由PS例如非常方便,,今天我们岩石三维效果的字体,让萧边告诉你如何让PS字体岩石三维效果,一起学习。 用ps制作三维岩石效果字体的方法 首先,我们需要的工具是数字板,当然…

重启MySQL在CentOS的各种方法(推荐)

重启MySQL在CentOS的各种方法(推荐)

方法,推荐,重启,电脑软件,CentOS,1。通过RPM包安装mysql 重新启动mysql服务 / / inint等。D / mysqld启动 2。从源包安装的MySQL 关闭mysql命令 mysql_dir美元/桶/ mysqladmin -中- P关机 启动mysql命令 mysql_dir美元/桶/ mysqld_safe 在…

centos6.5mysql5.7.14

centos6.5mysql5.7.14

电脑软件,centos6.5 MySQL 5.7.14 / 0 mysql5.7.14。 CMake - dcmake_install_prefix = /数据/ db5714 - dmysql_datadir = / / /无功数据db5714 - dmysql_unix_addr = / / /数据db5714 TMP /到 - ddefault_charset = utf8 - dde…

在jQuery的map()和每个()方法上

在jQuery的map()和每个()方法上

方法,电脑软件,jQuery,map,1。映射()方法 查找标题的所有元素,将它们的ID映射到排序后的数组中。 $(:头)。图(函数(){ return这个ID })。ToArray()Sort(); 2。每个()方法 $('div)。每个(函数(){) 如果($(这个)是(隐藏的)返回);跳过隐藏元素 操作视觉元素 }); 上面提到的jQ…

jQuery检查页面上某个元素是否有实

jQuery检查页面上某个元素是否有实

元素,实例代码,检查,页面,电脑软件,最近,一个项目有这样的功能。如果jQuery是用来检查网页上是否存在某个元素,它可以帮助阅读文章的读者。 要检查使用jQuery的Web页面上是否存在某个元素,应该根据元素的长度来判断它,代码如下所示: 如果($(# TT)…

如何查看PPT幻灯片母版如何查看PPT

如何查看PPT幻灯片母版如何查看PPT

教程,幻灯片,母版,电脑软件,PPT,幻灯片母版是存储模板信息的设计模板的元素。母版页上的文本只用于样式。那么我们如何检查PPT幻灯片的主栏呢让我们告诉你如何查看PPT幻灯片大师。 查看PPT幻灯片大师的方法 1,幻灯片的父版本 主幻灯片是…

Javascript首次使用正则测试()是true,第二次

Javascript首次使用正则测试()是true,第二次

正则,首次,测试,电脑软件,Javascript,1。前言 今天,我的朋友问了我一个问题。现在我需要多次匹配相同的内容,但是为什么我第一次匹配true,而第二个匹配是错误的呢 VaR S1 =MRLP ; VaR S2 =MRLP ; VaR reg = / / IG MRLP; console.log(reg.test(S1)); …

MySQL可以有一个类似于Oracle函数N

MySQL可以有一个类似于Oracle函数N

函数,类似于,有一个,电脑软件,MySQL,使用ifnull,不空 Isnull是判断是否为空,返回值为1表示零或0不空 ifnull相当于甲骨文的NVL,使用如下 MySQL >选择ifnull(1,10); -------------- + + | ifnull(1,10)| -------------- + + 1 | | ---------…

梅赛德斯奔驰概念跑车绘制过程分解

梅赛德斯奔驰概念跑车绘制过程分解

绘制,解图,梅赛德斯奔驰,跑车,过程,今天,我们分享奔驰跑车概念图的流程分解图,教程很不错,值得学习,推荐给大家,看看! 本教程结束,以上是奔驰跑车概念图的流程分解图,操作非常简单,希望对您有所帮助!…