公司一個功能,是放在setouttime()中執行的,setouttime(fn(),0),然后現在需要從其他廠家獲取一個引數key,獲取key的方法卻也是一個異步延遲,setinterval(getKey(),50)。
怎么保證先獲取到這個key,再執行執行fn()。
首先不能將fn()放入getKey()中,求大佬們解答。
uj5u.com熱心網友回復:
我了解的,setoutime()和seiinterval()都是異步宏,它們的執行順序不確定,有可能這個先執行,有可能那個先執行。uj5u.com熱心網友回復:
說需求,不一定要使用這倆uj5u.com熱心網友回復:
“setoutime()和seiinterval()都是異步宏”這個是不正確的,兩個都只是定時去執行一段代碼而已。getkey()總要做點什么吧,如果你不能修改它的話可以監視它帶來的改變
uj5u.com熱心網友回復:
超時呼叫:setTimeout(運算式,延遲時間) 在頁面載入完成之后 延遲指定時間后去執行一次運算式間歇呼叫:setInterval(運算式,毫秒) 頁面載入完成之后每隔毫秒 執行一次
再次,你要不要考慮使用Promise 物件試一下
uj5u.com熱心網友回復:
把setouttime() 也改成setinterval唄, 判斷 getkey有沒有執行,沒有就return 執行了 就執行fn 然后清除定時器;兩個異步 還要互相不干預,只能這樣輪詢uj5u.com熱心網友回復:
為何不用promise呢?就算用定時器也不能保證能拿到資料,網路不好肯定不會在規定時間回傳資料。50毫秒拿一次這個有問題吧,一般的http請求都很難在50ms回應資料getkey回應以后再執行fn,根本不需要定時器
getkey一直在變?為什么要寫setinterval多次獲取?
uj5u.com熱心網友回復:
如果出現網路延時,你會把廠家的api搞崩的。延時個10秒就會堆積幾百個請求一下子發過去。uj5u.com熱心網友回復:
用定時器,key是在一直變換嗎,如果只是一個異步,可以像樓上說的用promise也可以直接用新增的async 和await等待拿到key再執行settimeout里面的函式 如果是多次請求獲取了再執行,可以宣告一個變數,當拿到key改變變數的狀態,通過判斷變數的狀態執行settiemeoutuj5u.com熱心網友回復:
需求是這樣的,我們公司買了一個令牌key,廠家提供了一套js代碼獲取這個key,而這套代碼里就是用setinterval()定時獲取key。
uj5u.com熱心網友回復:
問題就是怎么固定先執行getKey()再執行fn(),geyKey是廠家提供的方法,fn是公司底層封裝的方法。
uj5u.com熱心網友回復:
就是說啊,key是廠家提供的一個u盤,然后他給了我一套獲取u盤里一個序列號的js方法,然后我發現這個方法居然是用setinterval間隔獲取,獲取成功一次后就cleansetinterval(),我都無語了。
uj5u.com熱心網友回復:
你fn 不是自己寫的邏輯嗎 getKey() 執行的結果 你總能判斷吧? 人家用 setinterval 你也用setinterval判斷 行不通嗎?
uj5u.com熱心網友回復:
把setouttime() 也改成setinterval唄, 判斷 getkey有沒有執行,沒有就return 執行了 就執行fn 然后清除定時器;兩個異步 還要互相不干預,只能這樣輪詢
問題就是怎么固定先執行getKey()再執行fn(),geyKey是廠家提供的方法,fn是公司底層封裝的方法。
你fn 不是自己寫的邏輯嗎 getKey() 執行的結果 你總能判斷吧? 人家用 setinterval 你也用setinterval判斷 行不通嗎?
這確實是個思路
uj5u.com熱心網友回復:
就是說啊,key是廠家提供的一個u盤,然后他給了我一套獲取u盤里一個序列號的js方法,然后我發現這個方法居然是用setinterval間隔獲取,獲取成功一次后就cleansetinterval(),我都無語了。
聽你這么說,你的意思是你都沒法判斷getKey的執行結果啊。你最終如何拿到key值?? 拿到了再fn()啊
uj5u.com熱心網友回復:
要我就定義一個全域變數, getKey之后改一下, fn()里判斷全域變數改變了才繼續執行uj5u.com熱心網友回復:
這個很簡單的,使用Promise就好了,可以使兩段邏輯代碼分開并且美觀,你可以私信我,我教你uj5u.com熱心網友回復:
fecth("url").then(res=>{//res是獲取到的內容,通過text(),json()處理獲取到的key
//這里你可以理解為 你的 getKey()
return key
}).then(key=>{
//這里就是你的fn()
})
uj5u.com熱心網友回復:
fecth("url").then(res=>{//res是獲取到的內容,通過text(),json()處理獲取到的key
//這里你可以理解為 你的 getKey()
return res.text() //上面的這里有個錯誤
}).then(key=>{
//這里就是你的fn()
})
uj5u.com熱心網友回復:
為什么不能將fn()放入getKey()??這是最簡單的回呼了這個不行的話 還可以看看 promise
獲取可以從業務層面修改一下代碼邏輯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/32063.html
標籤:JavaScript
上一篇:apache2.4.6如何調優
