2017-02-17 73 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