您的位置:

js如何同步执行代码的简单介绍

js如何同步执行代码的简单介绍

更新:

本文目录一览:

JS方法怎么同步执行

方法1 内部用了var 表示内部变量 执行完一次后会自动释放;

方法2 内的变量cc不能与方法1重名;

示例代码如下 测试可以

html xmlns=""

head

title/title

script language="javascript" type="text/javascript"

var str='';

function cfun(obj) { str += obj.value; }

function selall(){

var cc = document.getElementsByTagName("input");

for (var i = 0; i cc.length; i++) {

cfun(cc[i]);

}

alert(str);

}

/script

/head

body

input type="text" id="txt1" value="你好" /

input type="text" id="txt2" value="朋友" /

a href="javascript:selall()"点击显示/a

/body

/html

js怎么进行同步执行

**

* 解决异步加载问题

* */

function promise1(fun){

        this.fun1=function(){}

        this.fun2=function(){}

        try{

            fun(this.sol);

        }catch(err){

           

        }   

}

promise1.prototype={

fun1:function(){},

        fun2:function(){},

    sol:function(res){

        setTimeout(function(){

            promise1.prototype.fun1(res)

            promise1.prototype.fun2(res)

        },0)

    },

    then:function(fun1){

        promise1.prototype.fun1=fun1;

        return this

    },

    err:function(fun2){

        promise1.prototype.fun2=fun2;

    }

}

/**

*方法使用:方法1比方法2先执行

**/

new promise1(function(door){

functionA(door); //方法1

}).then(function(){

functionB();        //方法2

});

    functionA : fucntion(){

door;

如何实现 javascript “同步”调用 app 代码

在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论)。为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些情况下,我们可能更需要同步接口。同步接口的好处在于,首先 js 可以通过返回值得到执行结果;其次,在混合式开发中,app 层导出的某些 api 按照语义就应该是同步的,否则会很奇怪——一个可能在 for 循环中使用的,执行非常快的接口,比如读写某个配置项,设计成异步会很奇怪。

那么如何向 js 层导出同步接口呢?

我们知道,在 Android 框架中,通过 WebView.addJavascriptInterface() 这个函数,可以将 java 接口导出到 js 层,并且这样导出的接口是同步接口。但是在 iOS 的 Cocoa 框架中,想导出同步接口却不容易,究其原因,是因为 UIWebView 和 WKWebView 没有 addJavascriptInterface 这样的功能。同时,Android 这个功能爆出过安全漏洞,那么,我们有没有别的方式实现同步调用呢?我们以 iOS UIWebView 为例提供一种实现,WKWebView 和 Android 也可以参考。

为了找到问题的关键,我们看一下 iOS 中实现 js 调用 app 的通行方法:

首先,自定义 UIWebViewDelegate,在函数 shouldStartLoadWithRequest:navigationType: 中拦截请求。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

- (BOOL) webView:(UIWebView* _Nonnull)webView

shouldStartLoadWithRequest:(NSURLRequest* _Nonnull)request

navigationType:(UIWebViewNavigationType)navigationType {

if ([request.HTTPMethod compare:@"GET" options:NSCaseInsensitiveSearch] != NSOrderedSame) {

// 不处理非 get 请求

return YES;

}

NSURL* url = request.URL;

if ([url.scheme isEqualToString:@'YourCustomProtocol']) {

return [self onMyRequest:request];

}

return YES;

}

这种做法实质上就是将函数调用命令转化为 url,通过请求的方式通知 app 层,其中 onMyRequest: 是自定义的 request 响应函数。为了发送请求,js 层要建立一个隐藏的 iframe 元素,每次发送请求时修改 iframe 元素的 src 属性,app 即可拦截到相应请求。

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

* js 向 native 传递消息

* @method js_sendMessageToNativeAsync

* @memberof JSToNativeIOSPolyfill

* @public

* @param str {String} 消息字符串,由 HybridMessage 转换而来

*/

JSToNativeIOSPolyfill.prototype.js_sendMessageToNativeAsync = function (str) {

if (!this.ifr_) {

this._prepareIfr();

}

this.ifr_.src = 'YourCustomProtocol://__message_send__?msg=' + encodeURIComponent(str); }

当 app 执行完 js 调用的功能,执行结果无法直接返回,为了返回结果,普遍采用回调函数方式——js 层记录一个 callback,app 通过 UIWebView 的 stringByEvaluatingJavaScriptFromString 函数调用这个 callback(类似 jsonp 的机制)。

注意,这样封装的接口,天然是异步接口。因为 js_sendMessageToNativeAsync 这个函数会立即返回,不会等到执行结果发回来。

所以,我们要想办法把 js 代码“阻塞”住。

请回忆一下,js 中是用什么方法能把 UI 线程代码“阻塞”住,同时又不跑满 CPU?

1

2

3

4

var async = false;

var url = '';

var method = 'GET';brvar req = new XMLHttpRequest();br

req.open(method, url, async);brreq.send(null);

“同步”ajax(其实没这个词,ajax 内涵异步的意思)可以!在 baidu 的响应没返回之前,这段代码会一直阻塞。一般来说同步请求是不允许使用的,有导致 UI 卡顿的风险。但是在这里因为我们并不会真的去远端请求内容,所以不妨一用。

至此实现方式已经比较清楚了,梳理一下思路:

使用同步 XMLHttpRequest 配合特殊构造的 URL 通知 app层。

app 层拦截请求执行功能,将结果作为 Response 返回。

XMLHttpRequest.send() 返回,通过 status 和 responseText 得到结果。

那么,如何拦截请求呢?大家知道,UIWebViewDelegate 是不会拦截 XMLHttpRequest 请求的,但是 iOS 至少给了我们两个位置拦截这类请求——NSURLCache 和 NSURLProtocol。

一、NSURLCache 是 iOS 中用来实现自定义缓存的类,当你创建了自定义的 NSURLCache 子类对象,并将其设置为全局缓存管理器,所有的请求都会先到这里检查有无缓存(如果你没禁掉缓存的话)。我们可以借助这个性质拦截到接口调用请求,执行并返回数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

- (NSCachedURLResponse*) cachedResponseForRequest:(NSURLRequest *)request {

if ([request.HTTPMethod compare:@"GET" options:NSCaseInsensitiveSearch] != NSOrderedSame) {

// 只对 get 请求做自定义处理

return [super cachedResponseForRequest:request];

}

NSURL* url = request.URL;

NSString* path = url.path;

NSString* query = url.query;

if (path == nil || query == nil) {

return [super cachedResponseForRequest:request];

}

LOGF(@"url = %@, path = %@, query = %@", url, path, query);

if ([path isEqualToString:@"__env_get__"]) {

// 读环境变量

return [self getEnvValueByURL:url]; //*

} else if ([path isEqualToString:@"__env_set__"]) {

// 写环境变量

return [self setEnvValueByURL:url];

}

return [super cachedResponseForRequest:request];

}

注意注释有 * 号的一行,即是执行 app 接口,返回结果。这里的结果是一个 NSCachedResponse 对象,就不赘述了。

js如何同步执行代码的简单介绍

本文目录一览: 1、JS方法怎么同步执行 2、js怎么进行同步执行 3、如何实现 javascript “同步”调用 app 代码 JS方法怎么同步执行 方法1 内部用了var 表示内部变量 执行完一

2023-12-08
js代码同步异步的简单介绍

本文目录一览: 1、怎样用JS实现异步转同步 2、JS Promise 同步和异步代码执行的区别 3、javascript同步和异步的区别与实现方式 4、js执行顺序+同步异步 5、js 是同步执行

2023-12-08
htmljs编程笔记(html代码笔记)

本文目录一览: 1、html代码和JS代码有什么区别 2、如何在html中调用js函数 3、JavaScript学习笔记之数组基本操作示例 4、HTML5初学者笔记 5、《web前端笔记7》js字符—

2023-12-08
javascript简要笔记,JavaScript读书笔记

2022-11-17
如何将js代码转换为ts代码的简单介绍

本文目录一览: 1、变成ts的步骤 2、什么是ts 编程 3、js怎么转化为typescript 4、 如何将JS代码更换成异步统计代码' title='˃ 如何将JS代码更换成异步统计代码'˃˃ 如

2023-12-08
关于js代码同步异步的信息

2022-11-25
angularjs代码笔记01,angularjs简介

本文目录一览: 1、请问谁有混淆Angularjs代码的经验 2、如何使用angularjs处理动态菜单 3、如何看angularjs源代码 4、下回来的angularJs+bootstrap模板怎么

2023-12-08
同一页面js数据传输到java的简单介绍

本文目录一览: 1、js中调用java 如何将js中的参数传到java中 如何使用ajax 2、js中的值能传到java代码中去吗 3、js中怎么把值给java 4、怎么将js获取的值传递给当前页面中

2023-12-08
javascript入门笔记1的简单介绍

2022-11-18
怎样通过js获取数据库数据的简单介绍

本文目录一览: 1、js调用数据库里面的数据 2、js 如何读取数据库信息 3、javascript如何读取到数据库的信息 4、javascript中如何获取从数据库取出的数据? 5、JS 文件如何获

2023-12-08
js高级程序设计笔记14(js高级程序设计笔记14页)

本文目录一览: 1、JavaScript高级程序设计 该怎么看 2、JavaScript学习笔记之数组基本操作示例 3、JS中有关sort以及return的问题 JavaScript高级程序设计 该怎

2023-12-08
js修改cssimportant的简单介绍

本文目录一览: 1、js如何直接修改css里面的属性值呢? 2、笔记:JS设置CSS样式的几种方式 3、如何用JS修改已加载的CSS样式表样式? 4、JS修改CSS设置的样式 5、如何使用jquery

2023-12-08
重学java笔记,java笔记总结

2022-11-23
执行js代码大全,执行js代码大全下载

本文目录一览: 1、编写一段代码,如何用JS来实现插入几行几列的表格的功能,希望好心人能帮帮忙呢 2、求个简单javascript代码 谢谢,网站菜单功能 3、求C# winform中点击按钮执行网页

2023-12-08
js代码总结体会,js基础知识总结笔记

本文目录一览: 1、js到底难不难学? 2、JS 代码 求解释 可以详细的 说明一下 谢谢 3、浅谈js写轮播图的思路与心得 4、JavaScript与WEB前台开发课程实训总结怎么写 5、js中继承

2023-12-08
如何从python执行js的简单介绍

本文目录一览: 1、如何用python爬取js动态生成内容的页面 2、如何在 python 里运行 js 代码 3、python中如何调用js文件中的方法呢 如何用python爬取js动态生成内容的页

2023-12-08
html标签中用js代码的简单介绍

本文目录一览: 1、求助:HTML点击按钮调用JS文件或者直接调用JS代码? 2、如何在html中调用js代码 3、怎么在html文件中调用js文件 4、HTML如何插入js? 求助:HTML点击按钮

2023-12-08
js执行linux类库的简单介绍

本文目录一览: 1、js怎么在linux平台下通过火狐调用linux命令 2、nodejs 怎么运行linux 3、浏览器中的javascript能调用linux客户端上的上的shell程序吗 js怎

2023-12-08
js待办事项列表添加删除代码的简单介绍

本文目录一览: 1、“点击此处可添加笔记”的代码怎么写 2、js动态添加、删除html代码 3、vivo手机便签怎么一起删 “点击此处可添加笔记”的代码怎么写 输入符号就可以了第一步打开手机,点击备忘

2023-12-08
请问如何能让js代码按顺序执行(请问如何能让js代码按顺序执

本文目录一览: 1、如何确保JavaScript的执行顺序 2、如何让多个 JavaScript 动画按一定的顺序排队执行 3、js 怎么让方法执行有先后顺序 4、请问如何能让js代码按顺序执行 5、

2023-12-08