Promise履行处理程序未定义

jer*_*ome 8 javascript node.js promise bluebird

看起来非常基本,基于Promise的实现的实现不会返回我期望看到的值/数据.

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

sdk.request(options) => Promise~Response ? Object (JSON)
Run Code Online (Sandbox Code Playgroud)

这是我模型中的代码:

return sdk.request(options).then(function (value) {
    return value;
});
Run Code Online (Sandbox Code Playgroud)

当我记录模型的返回时,我看到:

{
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _progressHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined,
    _settledValue: undefined
}
Run Code Online (Sandbox Code Playgroud)

当我看到_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;
});
Run Code Online (Sandbox Code Playgroud)

the*_*eye 9

then处理程序将创建一个新的承诺的对象,并且将返回,这样的承诺可以链接.

引用bluebird的文档then,

返回从此承诺链接的新承诺.


在你的情况下,

sdk.request(options)
Run Code Online (Sandbox Code Playgroud)

返回一个promise对象,它有一个履行处理程序,它是以下then处理程序.

.then(function (value) {
    return value;
});
Run Code Online (Sandbox Code Playgroud)

但是then处理程序返回一个新的promise对象,它还没有一个履行处理程序.这就是为什么_fulfillmentHandler0undefined.

你可以这样确认一下

var promise = require("bluebird").resolve();
console.log(promise);
Run Code Online (Sandbox Code Playgroud)

将打印

{ _bitField: 268435456,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined }
Run Code Online (Sandbox Code Playgroud)

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

var promise1 = promise.then(function () {})
console.log(promise);
Run Code Online (Sandbox Code Playgroud)

将打印

{ _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 }
Run Code Online (Sandbox Code Playgroud)

注1:单个promise对象可以有多个履行处理程序.这就是上面的输出显示的原因[Function],这意味着一系列功能.

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


根据最后的评论,

我想记录/验证由...返回的数据/值 sdk.request

是的,你可以用蓝鸟做得很好.你可以简单地tap承诺,你可以打印实际的解决值,就像这样

return sdk.request(options).tap(console.log);
Run Code Online (Sandbox Code Playgroud)

将打印实际解析的值,您可以附加then处理程序来处理已解析的值.