承诺履行处理程序未定义
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 一个新的承诺对象,它还没有实现处理程序。这就是为什么 _fulfillmentHandler0
是 undefined
.
你可以这样确认
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
处理程序来处理解析值。
看起来非常基本,基于 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 一个新的承诺对象,它还没有实现处理程序。这就是为什么 _fulfillmentHandler0
是 undefined
.
你可以这样确认
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
处理程序来处理解析值。