为什么返回的 Promise 在登录到控制台时没有方法

Why does a returned Promise not have a method on it .then when logged to the console?

本文关键字:控制台 有方法 登录 返回 Promise 为什么      更新时间:2023-09-26

我知道一个新的承诺有一个.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,它将注册一个函数,该函数将在解析Promise1returns Promise2 .无论哪种情况,您都会立即得到Promise2 objectcallbacks不会返回任何不是真正functional编程的东西,它只是依赖于After Effect。

Promise与正常callback的主要思想是它会立即向您返回一个Object,称为Promise Object。优点是,当PromisePromise1已完成时,您可以使用then将未来事件附加到该事件,而不是程序中的其他地方。这是高度可扩展的,比如如果你想循环和附加一些东西then.then.then等等!

这个return Object是一个重要的概念 Promise ,如果您没有得到这个Object作为回报,您将不得不在程序其他地方的callback1函数中执行此操作,而不是立即执行此操作。想象一下,在callback1之后必须再注册一个电话。它开始变得非常混乱。一切正常,但是维护起来会开始变得复杂。而且你不会写这样的函数式编程 https://stackoverflow.com/a/35786369/452102 这真的是一种惯用的写东西的方式。

通过Promise的实现将更有利于学习这些概念,因为有很多地方的 API 根据情况而表现不同。这种Promise抽象的好处是,一旦最终用户习惯了它,一切看起来都非常无缝。