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; }); 

       

网上收集的解决方案 "Promise履行处理程序undefined"

then处理程序将创build一个新的承诺对象 ,这将被返回,使承诺可以链接。

那么引用蓝鸟的文档 ,

返回从这个承诺链接的新承诺。


在你的情况下,

 sdk.request(options) 

返回一个承诺对象,并有一个履行处理程序,这是以下处理程序。

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

但是then处理程序返回一个新的承诺对象,它还没有履行处理程序。 这就是为什么_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:单个承诺对象可以有多个履行处理程序。 这就是为什么上面的输出显示[Function] ,这意味着一个函数的数组。

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


根据最后的评论 ,

我想logging/validation由sdk.request返回的数据/值

是的,蓝鸟可以很好地做到这一点。 您可以简单地tap承诺,并可以打印实际parsing的值,像这样

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

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