导航:首页 > 编程语言 > 异步方法使其同步执行js

异步方法使其同步执行js

发布时间:2021-12-08 14:57:30

js如何异步执行方法

functionmyThread(callback){

returnsetTimeout(1000*10,function(){

$("#div").append("<p>hello</p>");//10秒后在div中加一个行,然后在执行callback函数

callback();

});

}

用回调内函容数

functionA(fun){

vartemp=100;

temp=temp*temp;

window.setTimeout(function(){

fun(temp);

},0);

alert("a函数:"+temp);

}

functionB(r){

alert("b函数"+r);

}

A(B);//调用

⑵ 怎么让异步先执行完了再执行js方法

方式一:用回调的方式,将要执行的方法放在异步函数的回调方法里面
方法二:promise了解下,结合async, awit,将异步方法,写成同步方法。

⑶ 如何等待异步方法执行完再继续执行该js方法

在异步方法的回调函数中调用该js方法即可

⑷ JS 怎么让整体的for同步执行而for中的异步函数异步执行

functionasync1(callback){
setTimeout(_=>{
console.log('async1:'+newDate().toTimeString());
callback();
},2000);
}

functionasync2(){
returnnewPromise(resolve=>{
setTimeout(_=>{
console.log('async2:'+newDate().toTimeString());
resolve();
},2000);
})
}

functionasync3(){
returnPromise.resolve().then(_=>console.log('async3:'+newDate().toTimeString()));
}

//将async1封装为方式
functionasync1_promise(callback){
returnnewPromise((resolve,reject)=>{
try{
async1((...args)=>{
typeofcallback==='function'&&callback.apply(null,args);
resolve();
});
}catch(e){
reject(e);
}
});
}

functiontest1(){
//先执行4次async1,执行完上1个再执行下一个
//然后执行4次async2,执行完上1个再执行下一个
//再执行1次async3
async1_promise()
.then(_=>async1_promise())
.then(_=>async1_promise())
.then(_=>async1_promise())
.then(_=>async2())
.then(_=>async2())
.then(_=>async2())
.then(_=>async2())
.then(_=>async3());
}

functiontest2(){
//和test1相同,只是写法简化,如果要执行很多次可以这么写
varstep=Promise.resolve();
for(leti=0;i++<4;step=step.then(_=>async1_promise()));
for(leti=0;i++<4;step=step.then(_=>async2()));
step.then(_=>async3());
}

functiontest3(){
//先执行4次async1,无需等待上1个执行完就执行下一个
//然后执行4次async2,无需等待上1个执行完就执行下一个
//再执行1次async3
Promise.all(Array.from(newArray(4),_=>async1_promise()))
.then(_=>Promise.all(Array.from(newArray(4),_=>async2())))
.then(_=>async3());
}

如果要测试,注意不要同时运行,需要单独运行test1, test2, test3, 在浏览器控制台查看效果.

⑸ 不要对JS异步回调函数进行同步调用,为什么

//对异步函数进行同步调用会由于程序执行顺序的不确定带来不确定的结果专

functiongetValue1(){
//异步
vara=1;
$.ajax({
url:'xxx',
success:function(){
a=2;
}
});
returna;
}属

functiongetValue2(){
//同步
vara=1;
$.ajax({
url:'xxx',
async:false,
success:function(){
a=2;
}
});
returna;


getValue1();//返回1(可能性更大)或者2,返回时success函数很可能还没执行
getValue2();//返回2,success函数执行完以后才返回

⑹ js函数可以同步执行么

javascript 就是单线程,从上往下执行,不存在并发。
至于ajax的异步,也是等待主线程空内闲才会执行容回调函数,也不会并发。
定时器和ajax的异步,都是必须等主线程空闲才会执行代码
lz可以写个for循环,来测试定时器和ajax的异步及超时,就明白了

⑺ js可以让同步函数异步执行吗

setTimeout(function(){/*异步执行的代码或函数*/}, 0)

⑻ 站ajax加载,异步的页面有js,应该如何让它执行。

1、AJAX提交,异步页面JS是可以执行的,
2、只不过对于这种页面既有HTML又有JS的解释性内语言,执行是讲究先容后顺序的
3、除非就是给JS绑定事件如引入jquery文件后$(function(){});其中绑定事件代码部分要写到{}里面
4、或者JS操作的是异步页面标签,可以选择把JS代码部分放到HTML代码部分后面

⑼ javascript promise 的异步方法,到底怎么同步执行

同步的话,必须这个操作完了才会执行下一步,在等待期间浏览器会挂起不能执行任何版接下来的js代码;异权步则是【告诉】浏览器去做,【告诉】是一瞬间的事情,然后就继续执行下一步了,等到结果返回来了,浏览器会通知js执行相应的回调。

⑽ 怎样用JS实现异步转同步

源起

小飞是一名刚入行前端不久的新人,因为进到了某个大公司,俨然成为了学弟学妹眼中'大神',大家遇到js问题都喜欢问他,这不,此时他的qq弹出了这样一条消息

"hi,大神在吗?我有个问题想问,现在我们的代码里面有这样的东西,可是得不到正确的返回结果

1234567functiongetDataByAjax () {return$.ajax(...postParam)}vardata = getDataByAjax()if(data) {console.log(data.info)}

"哦,你这里是异步调用,不能直接获得返回值,你要把if语句写到回调函数中",小飞不假思索的说到,对于一个‘专业’的fe来说,这根本不是一个问题。
“可是我希望只是改造getDataByAjax这个方法,让后面的代码成立。”
“研究这个没有意义,异步是js的精髓,同步的话会阻塞js调用,超级慢的,但是你要一再坚持的话,用async:true就好了”
“不愧是大神,我回去立刻试一试,么么哒”

两天后,她哭丧着脸登上了qq
“试了一下你的方法,但是根本行不通,哭~~”
“别急,我看看你这个postParam的参数行吗”

123456{...dataType:'jsonp',async:true...}

"这是一个jsonp请求啊,老掉牙的东西了,,jsonp请求是没有办法同步的"
“我知道jsonp请求的原理是通过script标签实现的,但是,你看,script也是支持同步的呀,你看tags/attscriptasync.asp”
“额,那可能是jquery没有实现吧,哈哈”
“大神,你能帮我实现一个jsonp的同步调用方式嘛,拜托了(星星眼)”
虽然他有点奇怪jquery为什么没有实现,但是既然w3school的标准摆在那里,码两行代码又没什么,

loadJsonpSync = (url) => {varresult;window.callback1 = (data) => (result = data)lethead = window.document.getElementsByTagName('head')[0]letjs = window.document.createElement('script')js.setAttribute('type','text/javascript')js.setAttribute('async','sync')// 这句显式声明强调src不是按照异步方式调用的js.setAttribute('src', url)head.appendChild(js)returnresult}

额,运行起来结果竟然是undefined!w3cshool的文档竟然也不准,还权威呢,我看也不怎么着,小飞暗自想到。

“刚才试了一下,w3school文档上写的有问题,这个异步属性根本就是错的”
“可是我刚还试过一次这个,我确认是好的呀”

12<script src="loop50000 && put('frist').js"></script><script src="put('second').js"></script>

(有兴趣的同学可以实现以下两个js,并且加上async的标签进行尝试。)
“这个,我就搞不清楚了”,小飞讪讪的说到
对方已离线

抽象

关于这个问题,相信不只是小飞,很多人都难以解答。为什么ajax可以做到同步,但jsonp不行,推广到nodejs上,为什么readFile也可以做到同步(readFileSync),但有的库却不行。
(至于script的async选项我们暂时避而不谈,是因为现在的知识维度暂时还不够,但是不要着急,下文中会给出明确的解释)
现在,让我们以计算机科学的角度抽象这个问题:

我们是否可以将异步代码转化为同步代码呢?(ASYNCCALL => SYNCCALL)

既然是抽象问题,那么我们就可以不从工程角度/性能角度/实现语言等等等方面来看(同步比异步效率低下),每增加一个维度,复杂程度将以几何爆炸般增长下去。

首先,我们来明确一点,==在计算机科学领域==同步和异步的定义

同步(英语:Synchronization),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象。在系统中进行同步,也被称为及时(in time)、同步化的(synchronous、in sync)。--摘自网络
异步的概念和同步相对。即时间不一致,不统一

明确了这一点,我们可以借助甘特图来表示同步和异步

注意看我们标红的地方,如果你完成了小测验1,就会得到和这张图一致的顺序

==同步执行的代码片段必然在异步之前。==

所以,无论从理论还是实际出发,我们都不得不承认,在js中,把异步方法改成同步方法这个命题是水月镜花

哦对了,最后还需要解释一下最开始我们埋下的坑, 为什么jsonp中的async没有生效,现在解释起来真的是相当轻松,即document.appendChild的动作是交由dom渲染线程完成的,所谓的async阻塞的是dom的解析,而非js引擎的阻塞。实际上,在async获取资源后,与js引擎的交互依旧是push taskQueue的动作,也就是我们所说的async call

推荐阅读: 关于dom解析请大家参考webkit技术内幕第九章资源加载部分

峰回路转

相信很多新潮的同学已经开始运用切了async/await语法,在下面的语法中,getAjax1和console之间的具有同步的特性

1234asyncfunction() {vardata = await getAjax1()console.log(data)}

讲完了event loop和异步的本质,我们来重新审视一下async/await。
老天,这段代码亲手推翻了==同步执行的代码片段必然在异步之前。== 的黄金定律!
惊不惊喜,意不意外,这在我们的模型里如同三体里的质子一样的存在。我们重新审视了一遍上面的模型,实在找不到漏洞,找不到任何可以推翻的点,所以真的必须承认,async/await绝对是一个超级神奇的魔法。
到这里来看我们不得不暂时放弃前面的推论,从async/await本身来看这个问题
相信很多人都会说,async/await是CO的语法糖,CO又是generator/promise的语法糖,好的,那我们不妨去掉这层语法糖,来看看这种代码的本质, 关于CO,读的人太多了,我实在不好老生常谈,可以看看这篇文章,咱们就直接绕过去了,这里给出一个简易的实现
/5800210.html

functionwrap(wait) {variteriter = wait()const f = () => {const { value } = iter.next()value && value.then(f)}f()}function*wait() {varp = () =>newPromise(resolve => {setTimeout(() => resolve(), 3000)})yieldp()console.log('unlock1')yieldp()console.log('unlock2')console.log('it's sync!!')}

终于,我们发现了问题的关键,如果单纯的看wait生成器(注意,不是普通的函数),是不是觉得非常眼熟。这就是我们最开始提出的spinlock伪代码!!!
这个已经被我们完完全全的否定过了,js不可能存在自旋锁,事出反常必有妖,是的,yield和*就是表演async/await魔法的妖精。
generator和yield字面上含义。Gennerator叫做生成器,yield这块ruby,python,js等各种语言界争议很大,但是大多数人对于‘让权’这个概念是认同的(以前看到过maillist上面的争论,但是具体的内容已经找不到了)

扩展阅读---ruby元编程 闭包章节yield(ruby语义下的yield)

所谓让权,是指cpu在执行时让出使用权利,操作系统的角度来看就是‘挂起’原语,在eventloop的语义下,似乎是暂存起当时正在执行的代码块(在我们的eventloop里面对应runPart),然后顺序的执行下一个程序块。
我们可以修改eventloop来实现让权机制

小测验2 修改eventloop使之支持yield原语

至此,通过修改eventloop模型固然可以解决问题,但是,这并不能被称之为魔法。

和谐共存的世界

实际上通过babel,我们可以轻松的降级使用yield,(在es5的世界使用让权的概念!!)
看似不可能的事情,现在,让我们捡起曾经论证过的
==同步执行的代码片段必然在异步之前。== 这个定理,在此基础上进行进行逆否转化

==在异步代码执行之后的代码必然不是同步执行的(异步的)。==

这是一个圈子里人尽皆知的话,但直到现在他才变得有说服力(我们绕了一个好长的圈子)
现在,让我们允许使用callback,不使用generator/yield的情况下完成一个wait generator相同的功能!!!

functionwait() {const p = () => ({value:newPromise(resolve => setTimeout(() => resolve(), 3000))})letstate = {next: () => {state.next = programPartreturnp()}}functionprogramPart() {console.log('unlocked1')state.next = programPart2returnp()}functionprogramPart2() {console.log('unlocked2')console.log('it's sync!!')return{value: void 0}}returnstate}

太棒了,我们成功的完成了generator到function的转化(虽然成本高昂),同时,这段代码本身也解释清楚了generator的本质,高阶函数,片段生成器,或者直接叫做函数生成器!这和scip上的翻译完全一致,同时拥有自己的状态(有限状态机)

推荐阅读 计算机程序的构造和解释 第一章generator部分
小测验3 实际上我们提供的解决方式存在缺陷,请从作用域角度谈谈

其实,在不知不觉中,我们已经重新发明了计算机科学中大名鼎鼎的CPS变换
Continuation-passing_style

最后的最后,容我向大家介绍一下facebook的CPS自动变换工具--regenerator。他在我们的基础上修正了作用域的缺陷,让generator在es5的世界里自然优雅。我们向facebook脱帽致敬!!egenerator

后记

同步异步 可以说是整个圈子里面最喜欢谈论的问题,但是,谈来谈去,似乎绝大多数变成了所谓的‘约定俗称’,大家意味追求新技术的同时,却并不关心新技术是如何在老技术上传承发展的,知其然而不知其所以然,人云亦云的写着似是而非的js。

==技术,不应该浮躁==

PS: 最大的功劳不是CO,也不是babel。regenerator的出现比babel早几个月,而且最初的实现是基于esprima/recast的,关于resprima/recast,国内似乎了解的并不多,其实在babel刚刚诞生之际, esprima/esprima-fb/acron 以及recast/jstransfrom/babel-generator几大族系围绕着react产生过一场激烈的斗争,或许将来的某一天,我会再从实现细节上谈一谈为什么babel笑到了最后~~~~

阅读全文

与异步方法使其同步执行js相关的资料

热点内容
小说主人公林辰的小说 浏览:325
受宠攻病弱美人攻 浏览:165
男gl电影推荐车 浏览:133
latex生成pdf文件很大 浏览:853
肉呢女 浏览:13
大尺度出轨电影 浏览:382
内详导演的同性剧 浏览:16
破解收费小电影 浏览:975
都市之美艳后官小说 浏览:281
似乎影视怎么进入 浏览:1
有什么现在看电影的网址 浏览:915
国外电影地址发布网 浏览:242
外婆的家电影完整版 浏览:667
有一个什么网可以看所有电影 浏览:748
黛妃小说txt下载 浏览:71
aqdyu 浏览:399
同人小说网 小说 浏览:433
win10电脑软件自启动 浏览:836
js获取图片位置 浏览:354
vb股票实时数据在哪里 浏览:777

友情链接