欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS中promise特點(diǎn)與信任問題解決

 更新時間:2022年06月07日 09:18:30   作者:言不及行yyds  
大家都知道Promise解決了回調(diào)地獄的問題,“回調(diào)地獄”所說的嵌套其實(shí)是指異步的嵌套,它帶來了兩個問題:可讀性的問題和信任問題,下面這篇文章主要給大家介紹了關(guān)于JS中promise特點(diǎn)與信任問題解決的相關(guān)資料,需要的朋友可以參考下

1.Promise的信任問題

1.1信任問題

請?zhí)砑訄D片描述

所謂的信任問題就是你給出事物邏輯,將邏輯處理交給第三方解決

(即回調(diào)函數(shù)),此時會出現(xiàn)第三方給出的數(shù)據(jù)結(jié)果不是你希望的那樣。

比如重復(fù)調(diào)用,沒掉用。下次你在使用它是就會產(chǎn)生信任問題

1.2信任問題產(chǎn)生的原因

1.2.1調(diào)用過早

這個問題主要是擔(dān)心代碼是否會引入類似于Zlago這樣的副作用一種 JavaScript 開發(fā)人員虛構(gòu)的瘋狂惡魔,取名 Zalgo,**用來描述 JavaScript 中同步 / 異步的混亂**即一個任務(wù)有時異步操作,有是同步操作,可能會導(dǎo)致競態(tài)條件

Promise解決

promise即使是立刻完成,也無法被立刻調(diào)用。根據(jù)Promise特性可知道

要想看到結(jié)果必須通過==.then調(diào)用==

也就是將結(jié)果統(tǒng)一成異步操作

1.2.2調(diào)用過晚

請?zhí)砑訄D片描述

一個同步任務(wù)鏈無法按照上面的形式運(yùn)行,即在任務(wù)鏈中,下一個任務(wù),不一定

是在上一個任務(wù)被完全調(diào)度后在運(yùn)行的。即按照預(yù)期有效的延遲另一個回調(diào)的發(fā)生

Promise解決

只要是通過then注冊的回調(diào)都會下一個異步時機(jī)點(diǎn)發(fā)生時依次被調(diào)用。

回調(diào)中的任何一個都無法影響任何一個或延遲對其他回調(diào)的運(yùn)用

eg:

p.then(function(){
    p.then(function(){
        console.log("c")
    });
    console.log("A")
});
p.then(function(){
    console.log("B")
});

輸出結(jié)果是**A,B,C**

1.2.3回調(diào)未調(diào)用

產(chǎn)生原因:回調(diào)函數(shù)有js語法錯誤等

Promise解決

可通過p.catch()獲取錯誤信息,因?yàn)榧词够卣{(diào)函數(shù)中有錯誤,回調(diào)函數(shù)還是會被調(diào)用

可通過下面的方式解決

function timeout(delay){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            reject('Timeout!')
        },delay)
    })
}
Promise.race([
    foo(),
    timeout(3000)
]).then(
    function(){
        //foo(...)及時完成
    },
    function(err){
        //foo(...)被拒絕,或者沒按時完成
    }
)

1.2.4調(diào)用次數(shù)過少或過多

調(diào)用次數(shù)過少就是沒有調(diào)用

Promise解決

Promise只能進(jìn)行一次決議,所以任何通過then(…)注冊的回調(diào)都只會調(diào)用一次

1.2.5未傳遞參數(shù)、環(huán)境值

回調(diào)函數(shù)不知道處理那些數(shù)據(jù),以及改怎么執(zhí)行

Promise解決

如果你沒有用任何值顯式?jīng)Q議,默認(rèn)用undefined代替

#### 1.2.6吞掉錯誤和異常

回調(diào)函數(shù)出現(xiàn)錯誤和異常時在某種情況下,不向外拋出提示

2.Promise的幾個關(guān)鍵問題

2.1怎么改變Promise的狀態(tài)

通過resolve()

resolve('ok');        // pending   => fulfilled (resolved)

通過reject()

reject("error");      // pending  =>  rejected 

2.2Promise 指定多個回調(diào)

一個promise對象通過多個==.then()==調(diào)用

eg:

let p = new Promise((resolve, reject) => {
            // resolve('OK');
        });

        ///指定回調(diào) - 1
        p.then(value => {
            console.log(value);
        });

        //指定回調(diào) - 2
        p.then(value => {
            alert(value);
        });

結(jié)果是可以的

會先出現(xiàn)alert()彈框,后控制臺打印

2.3Promise 改變狀態(tài)與指定回調(diào)的順序問題

都有可能一般先指定回調(diào)后改變狀態(tài)

先改變狀態(tài)后指定回調(diào)的方法如下,也可以通過reject()或resolve()

let p = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve("OK");
        }, 2000);
      });

      p.then(
        (value) => {
          console.log(value);
        },
        (reason) => {
          console.log(reason);
        }
      );

請?zhí)砑訄D片描述

2.4Promise.then方法的返回結(jié)果特點(diǎn)

如果執(zhí)行then方法返回的是非Promise對象

新promise變?yōu)閞esolved, value為返回的值

let p = new Promise((resolve, reject) => {
            resolve('ok');
        });
let result = p.then(value => {
     console.log(value);
        //返回結(jié)果是非 Promise 類型的對象
      return 521;
          });
     }, reason => {
          console.warn(reason);
      });
console.log(result);

請?zhí)砑訄D片描述

如果拋出異常, 新 promise 變?yōu)?rejected, reason 為拋出的異常

如果返回的是另一個新promise, 此promise的結(jié)果就會成為新promise的結(jié)果

let p = new Promise((resolve, reject) => {
        resolve("ok");
      });
//執(zhí)行 then 方法
let result = p.then(
 (value) => {
    console.log(value);
     //3. 返回結(jié)果是 Promise 對象
return new Promise((resolve, reject) => {
     resolve('success');
     //reject('error');
  });
 },
 (reason) => {
      console.warn(reason);
     }
   );
 console.log(result);

請?zhí)砑訄D片描述

2.5異常穿透

當(dāng)使用 promise 的 then 鏈?zhǔn)秸{(diào)用時, 可以在最后指定失敗的回調(diào),
前面任何操作出了異常, 都會傳到最后失敗的回調(diào)中處理

let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });

        p.then(value => {
            // console.log(111);
            throw '失敗啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

請?zhí)砑訄D片描述

總結(jié):1.深入了解回調(diào)函數(shù)的一些問題
2.了解Promise怎么解決這些信任問題
3.了解了promise的特點(diǎn)

總結(jié)

到此這篇關(guān)于JS中promise特點(diǎn)與信任問題解決的文章就介紹到這了,更多相關(guān)JS promise信任問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論