導航:首頁 > 編程語言 > js代碼同步

js代碼同步

發布時間:2025-01-08 09:07:55

js函數可以同步執行么

javascript 就是單線程,從上往下執行,不存在並發。
至於ajax的非同步,也是等待主線程空內閑才會執行容回調函數,也不會並發。
定時器和ajax的非同步,都是必須等主線程空閑才會執行代碼
lz可以寫個for循環,來測試定時器和ajax的非同步及超時,就明白了

⑵ js 是同步執行 還是非同步執行

你好,js是同步執行的,一個簡單示例解釋,

for(vari=0;i<10;i++)
console.log(i)
for(vari=10;i<20;i++)
console.log(i)

以上兩個for循環,第一個列印1-10,第二個列印10-20,結果是1-20按順序輸出

js中代碼是同步執行的,只有在ajax的情況下,會導致代碼執行順序改變,是因為ajax的請求時間導致

希望可以幫助到你

⑶ 如何實現 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 的 函數調用這個 callback(類似 jsonp 的機制)。
注意,這樣封裝的介面,天然是非同步介面。因為 js_sendMessageToNativeAsync 這個函數會立即返回,不會等到執行結果發回來。
所以,我們要想辦法把 js 代碼「阻塞」住。
請回憶一下,js 中是用什麼方法能把 UI 線程代碼「阻塞」住,同時又不跑滿 CPU?

1
2
3
4

var async = false;
var url = 'http://.com';
var method = 'GET';<br>var req = new XMLHttpRequest();<br>
req.open(method, url, async);<br>req.send(null);

「同步」ajax(其實沒這個詞,ajax 內涵非同步的意思)可以!在 的響應沒返回之前,這段代碼會一直阻塞。一般來說同步請求是不允許使用的,有導致 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代碼同步相關的資料

熱點內容
linux配置classpath 瀏覽:400
高水平的編程人員一般用什麼電腦 瀏覽:428
電腦壓縮文件找不到怎麼回事 瀏覽:870
c語言程序設計實驗報告順序結構 瀏覽:798
微信什麼版本適合安卓236 瀏覽:41
瑞風s5車載導航找不到相關文件 瀏覽:709
冬瓜影視app哪個最靠譜 瀏覽:159
移動數據流量無法用怎麼辦 瀏覽:420
u盤聽歌找不到多媒體文件 瀏覽:383
win10經常無網路連接不上 瀏覽:471
iphone5se翻新機鑒別 瀏覽:124
ai畫冊教程 瀏覽:32
js數字校驗銀行卡號 瀏覽:419
質量工作總結需要哪些數據 瀏覽:206
iphone6怎麼收彩信 瀏覽:985
ape文件如何打開 瀏覽:495
越獄後的iphone5怎麼刪除其他 瀏覽:843
開機無需密碼 瀏覽:870
電腦系統的密碼文件是什麼 瀏覽:91
app如何賣 瀏覽:853

友情鏈接