为什么返回的 Promise 在登录到控制台时没有方法
Why does a returned Promise not have a method on it .then when logged to the console?
我知道一个新的承诺有一个.then方法。
但是当我控制台记录从getUserData('jeresig')返回的承诺时,我会将此对象记录到控制台(没有.then方法)。
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
.then 实际上是在新的 promise 对象上,还是稍后才会异步添加到对象中?
那么这是否意味着 .then 是异步调用的,即使它看起来是同步的?
let Promise = require('bluebird'),
GitHubApi = require('github'),
let github = new GitHubApi({
version: '3.0.0'
});
function getUserData (user){
return new Promise(function(resolve, reject){
github.user.getFollowingFromUser({
user: user,
per_page: 2
}, function(err, res){
if (err){ reject(err) }
else {
resolve(res)
}
})
})
}
console.log(getUserData('jeresig'))
// .then(function(data){
// console.log('data', data)
// })
// .catch(function(error){
// console.log('error', error)
// })
.then()
处理程序已经存在。 这只是您在控制台中查看的内容的问题。
它位于对象的原型上,默认情况下未在console.log()
中显示。 由于看起来您正在查看蓝鸟承诺,因此如果您在 Chrome 的控制台中查看返回的承诺,您可以在控制台中展开该对象并查看 promise 对象上的所有内容,包括原型上的方法。 从承诺被创造的那一刻起,.then()
就在那里。
您还可以通过这样做来确定它在那里:
var p = getUserData('jeresig');
console.log(p.then);
而且,.then()
必须首先存在,否则承诺的整个概念将不起作用,因为您同步调用.then()
。 这就是你如何登记你的兴趣,知道承诺在未来何时得到解决。
是的,.then
实际上是在创建后的新 promise 对象上(它在 Promise 原型中)。它是同步的,因为它仍然添加回调来完成和拒绝事件。
尝试
console.log(getUserData('jeresig').then)
那么这是否意味着 .then 是异步调用的,即使它看起来 同步?
then
方法与"在此承诺解决后做某事"同义。 根据承诺状态(多态性),then
的行为有所不同,除非您阅读源代码或花一些时间理解该概念,否则最初可能会混淆。
如果Promise1
已经解析,那么它对您来说returns
Promise2
,并且还通过then
提供的转换函数解决了该Promise2
。如果此时未解析Promise1
,它将注册一个函数,该函数将在解析Promise1
并returns
Promise2
.无论哪种情况,您都会立即得到Promise2 object
。 callbacks
不会返回任何不是真正functional
编程的东西,它只是依赖于After Effect。
Promise
与正常callback
的主要思想是它会立即向您返回一个Object
,称为Promise Object
。优点是,当Promise
说Promise1
已完成时,您可以使用then
将未来事件附加到该事件,而不是程序中的其他地方。这是高度可扩展的,比如如果你想循环和附加一些东西then.then.then
等等!
这个return Object
是一个重要的概念 Promise
,如果您没有得到这个Object
作为回报,您将不得不在程序其他地方的callback1
函数中执行此操作,而不是立即执行此操作。想象一下,在callback1
之后必须再注册一个电话。它开始变得非常混乱。一切正常,但是维护起来会开始变得复杂。而且你不会写这样的函数式编程 https://stackoverflow.com/a/35786369/452102 这真的是一种惯用的写东西的方式。
通过Promise
的实现将更有利于学习这些概念,因为有很多地方的 API 根据情况而表现不同。这种Promise
抽象的好处是,一旦最终用户习惯了它,一切看起来都非常无缝。
- 为什么dijit.form.Select有方法setStore(),而dijit.fform.FilteringSele
- 控制台状态方法不可用,但似乎应该可用
- JSPM-是否有方法或需要对捆绑文件进行版本化
- 节点类控制台的方法日志未连接到该文件
- 当用户试图删除indexedDB数据库时,是否有方法执行函数
- Box2dWeb中是否有方法将对象的位置.x输出到console.log()
- 是否有方法在WebCrypto API中获取RSA密钥的组件
- 是否有方法可以快速确定浏览器是否支持启用了cors的图像而不会污染浏览器?
- 是否有方法以编程方式确定私钥是用DER还是PEM编码的?
- 在反序列化JSON对象时,是否有方法将属性名称转换为小写?
- MediaWiki中的MathJax:显示转义语法,控制台有404个错误
- 是否有方法检查特定点(X,Y)是否在SVG元素中
- 是否有方法减少相同if语句的代码
- 在控制台没有方法domReady错误,即使domReady被调用
- 在babel编译时是否有方法注入或忽略全局变量?
- Node.js query:是否有方法提示用户自定义大小的数组
- 在检查字符串时,是否有方法包含单词变体(过去时,动名词)
- 当元素不处于悬停状态时,是否有方法获得元素的HOVER样式?
- 是否有方法检测和更改输入值格式
- 解析JSON字符串后是否有方法获得对象属性