1. 程式人生 > >前端踩坑小結:多個非同步請求在同一個函式裡面執行時的同步問題之promise的用法。

前端踩坑小結:多個非同步請求在同一個函式裡面執行時的同步問題之promise的用法。

今天用VUE編寫專案時,涉及到兩個非同步請求在一個方法裡面對同一個變數進行操作,之前自己都沒意識到多個非同步請求對同一變數進行操作的時候會導致資料錯誤,結果今天除錯了半天,才想到了這個問題。也是怪自己還是一個新手,對於這種常識性的錯誤都不敏感。

於是自己查了一下相關資料,發現了promise的用法。剛開始的時候自己看了一下部落格,看的也是一臉懵逼。因為promise的寫法很多,很多也用到了新的ES6的寫法。但是自己看了一下程式碼例子,總算是明白了一下,廢話少講,直接上程式碼吧!

可以看到上面的程式碼是一個相對簡單的promise結構。因為我們用非同步請求的時候,會遇到多個請求同時發生,這樣不能保證它們的執行順序,會導致資料出錯,就像上面

的程式碼,儘管我取到了正確的資料,但是在頁面渲染的時候,就是完全是錯的。在上面的程式碼中,我們先new promise,在引數列表有兩個引數,一個resolve一個rejects。通俗的

來講,resolve相當於ajax中的success,rejects則就是catch。當然,這兩個單詞可以隨便取,也可以在引數列表寫上a,b。但是他們代表的意思是一模一樣的。在後面我們可以看

到一行程式碼“resolve()”,這就相當於return。在promise裡面的程式碼塊會最先執行,然後resolve(),接著會執行then裡面的方法。在then裡面也有引數,()=> {/程式碼塊/},因為我在上面

程式碼中resolve()的括號中並沒有寫引數,所以可以看成它返回的是一個空的結果集,所以我在then後面有()來接受,因為是空結果集,所以我用()來接收。當然你也可以返回想

要的結果,打個比方,我把程式碼改成下面這樣

我讓resolve返回了一個值,然後在then裡面打印出來。

可以看到,res被打印出來就是返回的值1。

沒有用promise之前,上面的語句順序就是亂的,因為我用promise控制了非同步請求的執行順序,所以現在的順序是正常的。

最後推薦一個連結,講promise講的特別詳細。我也是剛剛才看了一下promise,自己學的也不深,在這裡也不敢誤人子弟,所以還有很多更多的內容還沒有寫出來,如果

上面有什麼明顯的錯誤也請大家指出來的同時多多原諒。同時因為自己講的不深,大家可以繼續在網上找找資源,很多部落格上面講的也是特別詳細的。

https://zhuanlan.zhihu.com/p/25198178

相關推薦

前端小結:非同步請求同一個函式裡面執行同步問題promise用法

今天用VUE編寫專案時,涉及到兩個非同步請求在一個方法裡面對同一個變數進行操作,之前自己都沒意識到多個非同步請求對同一變數進行操作的時候會導致資料錯誤,結果今天除錯了半天,才想到了這個問題。也是怪自己還是一個新手,對於這種常識性的錯誤都不敏感。 於是自己查了一下相關資料,發

jquery $.when()非同步請求成功後再執行後續方法

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { // a1 and a2 are arguments resolved for the page1 and

js非同步請求

一,兩個(或多個)js非同步併發執行,怎麼在兩個AJax非同步操作之後執行一個新的操作 原題來自 ES6 方法 1.Promise 包裝非同步ajax操作,2.定義async 函式,3.用await等待promise資料非同步獲取完成這一種方法簡潔高效,下面請看我專門給你寫的示例程式碼

extjs 迴圈執行非同步請求,引數和後臺以及相關問題和衍生問題的處理

在Extjs中,非同步請求的寫法: Ext.Ajax.request({ url: '***.action', //async: false, params: { p1: v1, p2: v2 ... }, success: function(resp

非同步請求執行順序問題

情景一:多個非同步請求,虛擬碼:Ajax1(); Ajax2(); Ajax3();這三個Ajax請求並不存在執行順序,也就是2和3並不會等第一個Ajax請求完成再去執行,而是直接執行如果想要達到順序執行的效果,可以通過回撥函式來完成,虛擬碼:$.ajax({url:"ser

用ON_COMMAND_RANGE實現事件響應同一個函式

引數: id1 : 在連續範圍的命令 ID 的命令 ID。 id2 :命令 ID。連續範圍的命令 ID 的結尾。 memberFxn :命令訊息對映處理程式函式的名稱。 備註: 範圍與 id1 的 ID 與 id2的開頭和末尾。 使用 ON_COMMA

Java執行同步Lock用法

從JDK5.0開始,有兩種機制來保護程式碼塊不受到並行訪問的干擾。舊版本的Java使用synchronized關鍵字來達到這個目的,而JDK5.0引進了ReentrantLock()類。synchronize關鍵字自動提供一個鎖和相關的條件。 用Reentra

iOS開發-iOS執行緒開發中過的-GCD的特性-NSOperation執行緒依賴-iOS執行小結

本期內容: iOS開發中從其他執行緒回到主執行緒的方法 dispatch_group_create 組的概念 dispatch_sync同步排程主執行緒會死鎖的原因 專案中什麼時候選擇GCD什麼時候選擇NSOperation NSOperation 執行緒依賴

現在有非同步操作ajax請求,我們需要當所有非同步請求都成功的時候,執行後續操作

1》場景: 現在有多個非同步操作ajax請求,我們需要當所有非同步請求都成功的時候,執行後續操作 2》方法 方法一:通常的講,我們可以設定一個flag變數,然後在各自的ajax的成功回撥內去維護這個變數數量,當滿足條件時,我們來觸發後續函式 方法二: jq的$.wh

angular4 rxjs 非同步處理http請求資料

這是我在工作中遇到的一個需求問題,我們用的angular4,業務需要多次請求後臺資料,並且當資料全部返回的時候再處理資料,標題也不知道跟我說的內容一致不,那都不重要,重要的是實現了功能。當自己實現要這個功能的時候,作為弱小的我真的覺得這是不可以的實現的,好在我們這有一位大神,

前端開發】合併前端靜態資原始檔,減少HTTP請求次數

從優化請求靜態資原始檔(JS、CSS)的角度來說,載入多個檔案會發出多次請求,為了解決這個問題,我們可以把多個檔案合併成一個檔案,現在有一些前端工具可以把多個檔案合併成一個檔案,這種方式是靜態的在發版前就要合併成一個檔案,還有一種方式把多個檔案動態合併成一個檔案;所謂動態是把

Java異步執行HTTP請求的例子(需要apache http類庫)

ride 同步 conn done 例子 latch block org ftw 直接上代碼 package org.jivesoftware.spark.util; import java.io.IOException; import java.uti

[轉]ajax請求控制執行順序或全部執行後的操作

on() .when ati ack login tps als fun lan 本文轉自:https://blog.csdn.net/fsdad/article/details/71514822 一、當確保執行順序時: 1、 請求加async: false,,

launcher項目小結(1)

param change load 分頁 turn start eight image span launcher是一個安卓端的活動頁面。它在pc端的形式則是由資源,桌面和發布三大板塊組成。其中資源部分則是由素材圖片,APK資源,網頁資源和圖片資源四個頁面組成。 在完成素材

【SSH網上商城專案實戰24】Struts2中如何處理Model請求

    1. 問題的提出   Struts2中如果實現了ModelDriven<model>介面

flask在同一個頁面提交form請求

資源 兩個 eve end 多個 ssi print 後臺管理頁面 title 1.首先,在寫網站的後臺管理頁面的時候,發現,我要在同一個頁面上提交兩個表單,或者是可以單一的的提交其中一個,其中一個表單可以沒有數據也可以有數據,即兩者之間的提交是沒有什麽鳥關系的。 隨手寫的

協程等待非同步呼叫(list or dict)

from tornado import gen from tornado.httpclient import AsyncHTTPClient @gen.coroutine def coroutine_visit_list(): http_client = AsyncHTTPClient()

前端(二)--------------------------Import React vs React, { Component }

轉載https://stackoverflow.com/questions/39361282/import-react-vs-react-component Import React vs Import React, { Component } Which one i

iOS開發系列--並行開發(處理網路請求併發的情況)

概覽 大家都知道,在開發過程中應該儘可能減少使用者等待時間,讓程式儘可能快的完成運算。可是無論是哪種語言開發的程式最終往往轉換成組合語言進而解釋成機器碼來執行。但是機器碼是按順序執行的,一個複雜的多步操作只能一步步按順序逐個執行。改變這種狀況可以從兩個角度出發:對於單核處理

同一頁面ajax請求後臺堵塞問題

有個小夥子告訴我,一個頁面上同時開啟多個ajax,向後臺請求資料,會被堵塞。 “因為是同一個會話。但如果在控制器上加上這個特性就可以了”,小夥子說。 //session只讀,避免同一會話中ses