2017-02-17 64 views
1

我一個承諾對象的理解如下:承諾是如何創建的?

var Promise = { 
    then: function() { ... }, 
    catch: function() { ... } 
}; 

如果我有下面這段代碼有一個函數,並返回一個承諾對象(fetch.js):

var xhr = require('xhr') 

module.exports = function (uri) { 
    return new Promise(function (resolve, reject) { 
    xhr(uri, function (err, res, body) { 
     if (err) return reject(err) 
     if (res.statusCode !== 200) return reject(new Error(body)) 
     resolve(body) 
    }) 
    }) 
} 

然後在我index.js我請執行以下操作:

var fetch = require('./fetch'); 
var promise = fetch("some_url"); 

如何從var promise = fetch("some_url");返回承諾對象的結構f ormed?

fetch.jsnew Promise(...)部分中,您將函數傳遞給構造函數。我之前沒有看到過這種情況,並且想知道new Promise(...)部分中的resolvereject參數如何傳遞給上述示例Promise對象中的thencatch鍵。

+1

[ECMAScript 2015,25.4 Promise Objects,ff。](http://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects) – Andreas

+0

所以它說那裏'A PromiseCapability是一個Record值,用於封裝承諾對象以及能夠解析或拒絕承諾對象的函數。但是,「能夠解析或拒絕的函數」是如何從「新Promise(解析,拒絕){...})'構造函數? – CapturedTree

+1

請看到這篇文章https://www.promisejs.org/implementing/和鏈接的stackoverflow問題http://stackoverflow.com/questions/23772801/basic-javascript-promise-implementation-attempt/23785244#23785244 –

回答

4

我不能解釋,但您展​​示例如如何再發揮作用得到解析值或趕得到錯誤

採用可變保存的承諾,該變量 ,然後執行,然後功能類似波紋管例如

var a = new Promise(function (resolve, reject) { 
    resolve(1); 
}) 
a.then(); 

當你執行a.then()時,它會在promiseStatus中得到兩個參數PromiseStatus和PromiseValue,你會得到它解析或拒絕,並且在PromiseValue中你將得到你通過解析或拒絕處理器傳遞的值

Promise 
__proto__ 
: 
Promise 
catch:catch() 
constructor: Promise() 
then:then() 
Symbol(Symbol.toStringTag):"Promise" 
__proto__:Object[[PromiseStatus]]:"resolved"[[PromiseValue]]:1 
+0

另請參見[什麼\ [\ [PromiseValue \] \]在JavaScript控制檯中的含義以及如何得到它](http://stackoverflow.com/questions/28916710/what-does-promisevalue-mean-in- javascript-console-and-how-do-i-get-it) – guest271314

+0

承諾值會讓你作爲函數的參數,然後像這樣a.then(function(res){})在res中你將得到PromiseValue –

+0

所以基本上.then方法就在那裏(基本上是空的),當你創建一個新的Promise並訪問[[PromiseValue]]你會調用then來傳遞給then方法的函數,並以某種方式[[PromiseValue] ]會傳遞給你傳遞給函數的參數。 – CapturedTree