在解决此问题时,Promise会解析为null

时间:2017-11-14 13:57:07

标签: node.js promise

我有一个连接到API的函数。该函数返回一个Promise。当我使用包含this上下文的常量进行解析时,我无法弄清楚为什么Promise.resolve返回null。

const connect = () => {
  return new Promise((resolve, reject) => {
    Gitana.connect(config, function(err) {
      const platform = this;
      if (err) {
        return reject(err);
      }
      console.log(platform) // Object that I want
      resolve(platform)
    });
  });
}

connect()
  .then(platform => {
    console.log(platform) // null
  })

我不知道它是否有任何帮助,但我知道解析对象(平台)上有一个名为datastore的方法。如果我解决了这个方法,即resolve(platform.datastore)我得到了方法,而不是null

我尝试解析静态值,resolve(25)resolve('hello'),这样可以正常工作。

如何返回/解析对象?

2 个答案:

答案 0 :(得分:2)

正如您所指出的,看起来这种情况正在发生,因为您尝试传递的值实际上有一个.then方法,因此它被包含在承诺解析程序中。< / p>

传递它而不删除方法的一种方法是将其包装在容器中以便传输它:

const connect = () => {
  return new Promise((resolve, reject) => {
    Gitana.connect(config, function(err) {
      const platform = this;
      if (err) {
        return reject(err);
      }
      resolve({ platform });
    });
  });
}

connect()
  .then(({ platform }) => {
    console.log(platform)
  })

答案 1 :(得分:1)

事实证明,要解决的对象platform也有then方法。如果您使用新承诺解决原始承诺,那么它也会尝试解析新承诺。在这种情况下,新承诺将解析为null

const connect = () => {
  return new Promise((resolve, reject) => {
    Gitana.connect(config, function(err) {
      const platform = this;
      if (err) {
        return reject(err);
      }
      delete platform.this;
      resolve(platform);
    });
  });
}

接下来的问题是如何以更好的方式执行此操作,而不是删除每个过时的then方法。