承诺履行处理程序未定义

Promise fulfillment handler undefined

看起来非常基本,基于 Promise 的实现并不是 return我希望看到的 value/data。

这就是我期望此界面的工作方式:

sdk.request(options) => Promise~Response → Object (JSON)

这是我模型中的代码:

return sdk.request(options).then(function (value) {
    return value;
});

当我记录模型的 return 时,我看到了这个:

{
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _progressHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined,
    _settledValue: undefined
}

当我看到 _fulfillmentHandler0: undefined 时,这似乎暗示没有履行处理程序:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

但是履行处理程序似乎确实存在:

return sdk.request(options).then(function (value) {
    // fulfillment handler, right?
    return value;
});

then 处理程序将创建一个新的 promise 对象 并将返回该对象以便可以链接 promise。

引用 bluebird's documentation on then,

Returns a new promise chained from this promise.


在你的情况下,

sdk.request(options)

returns 一个承诺对象,它有一个实现处理程序,即以下 then 处理程序。

.then(function (value) {
    return value;
});

但是 then 处理程序 returns 一个新的承诺对象,它还没有实现处理程序。这就是为什么 _fulfillmentHandler0undefined.

你可以这样确认

var promise = require("bluebird").resolve();
console.log(promise);

将打印

{ _bitField: 268435456,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined }

因为 promise 还没有履行处理程序。但是当你给它附加一个处理程序时,就像这样

var promise1 = promise.then(function () {})
console.log(promise);

将打印

{ _bitField: 268435457,
  _fulfillmentHandler0: [Function],
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: 
   { _bitField: 0,
     _fulfillmentHandler0: undefined,
     _rejectionHandler0: undefined,
     _progressHandler0: undefined,
     _promise0: undefined,
     _receiver0: undefined,
     _settledValue: undefined },
  _receiver0: undefined,
  _settledValue: undefined }

注 1: 一个 promise 对象可以有多个 fulfillment handlers。这就是为什么上面的输出显示 [Function],这意味着一个函数数组。

注意 2:您不必太担心 Promise 对象的属性。这些是实施细节。


根据 ,

I want to log/verify the data/value returned by the sdk.request

是的,你可以用 bluebird 很好地做到这一点。你可以简单地 tap 承诺,你可以打印实际解析的值,就像这样

return sdk.request(options).tap(console.log);

将打印实际解析值,您可以附加一个 then 处理程序来处理解析值。