如何理解 Javascript 中的 Promise 物件的狀態不受外界影響?

時間 2021-05-30 19:42:54

1樓:胡小濺

你說反了,Promise 的狀態就是靠外界修改的。它自己並不會自發地從 Pending 變成 Resolved,它只是將可以改變內部狀態的 resolve 和 reject 方法暴露出來,由使用者決定什麼時候改變狀態。唯一的限制是狀態只能改變一次,一旦從 Pending 變為其它狀態就不再受控制了。

以前 Promise 剛出來的時候 defer 的寫法還比較流行,比如 Angular 裡的 $q 方法,這種寫法在某些方面上更直觀一些:

const

deferred=$q

.defer

();const

promise

=deferred

.promise

;promise

.then

(value

=>console

.log

(value

));deferred

.resolved

('resolved');

2樓:Storm

因吹絲挺!

先說結論, 還是不受外界影響.

所謂的狀態不受外界影響, 其實是, 當狀態由pending-> fulfilled, 或pending ->rejected之後, fulfilled, rejected這兩個狀態不受外界影響不可變更

當Promise的狀態還是pending的時候是可以變更的.

你應該把setTimeout的時間調小點, 看看你的Promise變成fulfilled: OK之後還會不會變成rejected.

結果是: 執行setTimeout去改變狀態的時候, Promise的狀態並不會變成rejected

這才是所謂的狀態不可逆, 不受外界影響.

你這個例子的做法, 只是把Promise的一些邏輯放到了外面去執行而已.

如何理解 JavaScript 定時器機制

倪凡 首先我們需要了解下的event loop。JS是單執行緒的也就意味著它每一次只能執行乙個任務,而任務分為同步和非同步,for迴圈屬於同步任務,而定時器屬於非同步。var宣告,沒有影響到程式的執行機制所以邏輯是 先執行完for迴圈,JS再去它的非同步佇列中去執行定時器,而這時i早已加滿。let宣...

javascript中object keys方法使用的問題(實操和書上寫的不相符)?

混混蛋 Object.keys obj 返回obj的自身 不包含原型鏈上的 的所以可列舉屬性的名字陣列 for in迴圈則包含原型鏈.for name in obj Object.getOwnPropertyNames obj 返回obj自身 不含原型鏈上的 的所有屬性名陣列,包括不可列舉的 想要獲...

javascript中Element nodeValue和innerHTML有什麼區別

DOM中的節點是分好幾種型別,常見的有 1.文件節點 document,唯一 2.元素節點 那些個標籤div,p之類 3.屬性節點 class,src這種 4.文字節點 插入在p,div內的文字 其它。其中element.nodeValue,是節點的值,其中屬性節點和文字節點是有值的,而元素節點沒有...