承诺实现处理程序未定义
Promise fulfillment handler undefined
非常基本,看起来,基于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对象,它还没有实现处理程序。这就是为什么_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对象可以有多个实现处理程序。这就是为什么上面的输出显示了[Function]
,它的意思是一个函数数组。
注2:你不必太担心Promise对象的属性。这些是实现细节。
根据上一条评论,
我想记录/验证
返回的数据/值sdk.request
是的,你可以用bluebird做得很好。您可以简单地tap
承诺,您可以打印实际的解析值,像这样
return sdk.request(options).tap(console.log);
将打印实际的解析值,您可以附加then
处理程序来处理解析值。
- 为什么这个函数调用会破坏程序并导致未定义的变量
- importScripts在web工作程序中返回未定义的
- 注入应用程序的角度控制器未定义
- 为什么我的程序提醒未定义的值
- Ionic应用程序在部署后给出ReferenceError:未定义Promise
- 运行此程序后出现错误,未捕获的类型错误:无法读取未定义的属性“推送”
- JSHint 错误:未定义我的应用程序 (W117)
- 尝试从我的 chrome 扩展程序访问 gmail 中的 iframe 时出现未定义的错误,但不是从开发者控制台访问
- 应用程序.js未在开发中加载(未捕获的引用错误:未定义 $)
- Javascript 运行时错误:“应用程序未定义”
- dhtmlx多个调度器不工作错误”;调度程序未定义”;
- 测试Ember.JS应用程序失败,返回ReferenceError:未定义Ember
- 为什么谷歌应用程序脚本抛出'引用错误:“;粗体“;未定义'使用.setBold()时
- Rally应用程序SDK 2.0rc1-未捕获引用错误:未定义集会
- Webpacked Angular2应用程序类型错误:无法读取属性'getOptional'的未定义
- 角度嵌套对象-TypeError:无法读取属性'应用程序'的未定义
- $window错误'$窗口未定义'Angular应用程序中的谷歌分析代码
- React应用程序错误'未捕获的ReferenceError:React未定义'
- "未定义“角度”;在Liferay中存储的角度应用程序上执行Protractor测试时出错
- 当使用 Jasmine 对我的 angularJS 应用程序进行单元测试时,$interval是未定义的