Promise履行处理程序undefined
非常基本的,似乎基于Promise的实现的实现不会返回我期望看到的值/数据。
这是我期待这个接口工作的方式:
sdk.request(options) => Promise~Response → Object (JSON)
这里是我的模型中的代码:
return sdk.request(options).then(function (value) { return value; });
当我logging模型的返回时,我看到这个:
{ _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
处理程序将创build一个新的承诺对象 ,这将被返回,使承诺可以链接。
那么引用蓝鸟的文档 ,
返回从这个承诺链接的新承诺。
在你的情况下,
sdk.request(options)
返回一个承诺对象,并有一个履行处理程序,这是以下处理程序。
.then(function (value) { return value; });
但是then
处理程序返回一个新的承诺对象,它还没有履行处理程序。 这就是为什么_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:单个承诺对象可以有多个履行处理程序。 这就是为什么上面的输出显示[Function]
,这意味着一个函数的数组。
注2:您不必太担心Promise对象的属性。 这些是实现细节。
根据最后的评论 ,
我想logging/validation由
sdk.request
返回的数据/值
是的,蓝鸟可以很好地做到这一点。 您可以简单地tap
承诺,并可以打印实际parsing的值,像这样
return sdk.request(options).tap(console.log);
将打印实际parsing的值,您可以附加一个then
处理程序来处理parsing的值。