承诺实现处理程序未定义

Promise fulfillment handler undefined

本文关键字:未定义 程序 处理 实现 承诺      更新时间:2023-09-26

非常基本,看起来,基于Promise的实现并没有返回我期望看到的值/数据。

这就是我期望这个接口的工作方式:

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

下面是我模型中的代码:

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

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

{
    _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处理程序将创建一个新的承诺对象,该对象将被返回,以便可以链接承诺。

引用bluebird关于then的文档,

返回一个由这个承诺链接起来的新承诺。


对你来说,

sdk.request(options)

返回一个promise对象,它有一个实现处理程序,它是下面的then处理程序。

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

但是then处理程序返回一个新的promise对象,它还没有实现处理程序。这就是为什么_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对象可以有多个实现处理程序。这就是为什么上面的输出显示了[Function],它的意思是一个函数数组。

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


根据上一条评论,

我想记录/验证sdk.request

返回的数据/值

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

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

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

相关文章: