簡體   English   中英

獲得已解決的Promise的同步價值

[英]Get value of resolved Promise in sync

如果我們知道Promise肯定已經解決了,我們如何獲取價值,如果我們不能,為什么不呢?

let a = Promise.resolve(123);

console.log(a.value); // ???

以下不起作用 - 打印“First,Last,123”

console.log("First");
Promise.resolve(123).then(console.log);
console.log("Last");

我問如何同步獲得已經解決的Promise的價值,如果不可能,為什么不呢?

不,這是不可能的。 這是設計的。

Promise A +規范旨在用作處理異步操作的簡單,一致的方法。 其中一個約束是將一個新的回調傳遞給已經解析的promise上的then()始終在事件循環的后續滴答中執行,因此事情是一致的。

添加第二種方法來檢查承諾結果是不可能的。 它可能很容易這樣做,但是在規范中添加它至少有2個問題:

  1. 如果您正在尋求構建規范,您希望它盡可能簡單。 規范本身實際上只定義了then()函數。
  2. 通過添加此功能,您可以為大量開發人員打開大門,讓他們對已經難以理解的事情感到更加困惑。

承諾和異步操作很難讓人理解。 我每天都會在這里看到關於承諾而不是“獲得”的問題。 如果訪問承諾結果的非異步方式將被添加到默認承諾中,我想這將是一個更大的數量。 嘗試並強制執行“正確的方式”是件好事。

但是,這個決定不僅僅是為您做出的。 你沒有被困在那里。 您可以非常輕松地構建自己的具有此功能的承諾版本,並且仍然可以使用現有的承諾。 只要你的對象有一個then()函數,它的行為符合Promises / A +,你可以隨意使用對象的其余部分。

您可以使用ES7 async/await語法

 (async () => { console.log("First"); console.log(await Promise.resolve(123)); console.log("Last"); })() 

請記住, await僅適用於async函數

解釋“為什么不能同步獲取已經解析的Promise的值”

承諾調試

按照設計,不能在不調用then()方法的情況下從代碼中同步檢查promise的即時狀態和值。

為了幫助調試,只有在手動檢查promise對象時,您才能看到更多信息作為代碼無法訪問的特殊屬性(目前,這是通過隨機化屬性名稱來實現的,因為缺少更復雜的語言或調試器支持)。

Promise.resolve(123).then(function(value) {
    console.log(value);
}

看看這個

Prom在JS中始終是異步的。

如果您確信承諾將要解決,那么您可以使用.then方法訪問它。

a.then(function(value) {
    console.log("First");
    console.log(value);
    console.log("Last");
    // expected output: 123
});

如果是console.log,變量a將在下面看起來相似

Promise {<resolved>: 123}
    __proto__: Promise
    [[PromiseStatus]]: "resolved"
    [[PromiseValue]]: 123

對於錯誤處理,您可以在MDN 文檔中提到錯誤阻止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM