【发布时间】:2016-03-10 13:26:16
【问题描述】:
我遇到了关于未终止的 Promise 链的 Promise 警告(“在处理程序中创建了一个 Promise,但没有从它返回”)。我是 Promises 的新手,我怀疑我不应该使用非事件驱动的思维。但我不确定如何进行。这一切都在一个 nodejs 项目中。
我正在与 ZWave 服务器交互以打开和关闭灯。这种交互的形式是向控制 ZWave 网络的服务器发出 http 请求。我使用 Promises 是因为通过 http 进行交互的异步特性。
在我的程序的一个级别,我定义了以下类方法:
ZWave.prototype.onOff = function (nodeNumber, turnOn) {
var self = this;
var level = turnOn ? 255 : 0;
return new Promise(function (resolve, reject) {
self.requestAsync(sprintf('/Run/devices[%d].instances[0].commandClasses[0x20].Set(%d)', nodeNumber, level))
.then(function (value) {
resolve(value == 'null');
})
.catch(function (error) {
reject(error);
});
});
};
requestAsync 类方法是实际处理与 ZWave 服务器交互的方法。从概念上讲,在 onOff() 中,我试图打开或关闭由 this.nodeNumber 标识的特定灯,然后返回该请求的结果。
onOff() 是从 Switch 类方法调用的,表示特定的灯光,如下所示:
this.onOff = function( turnOn ) {
var state = turnOn ? 'ON' : 'OFF';
var self = this;
zWave.onOff( this.nodeNumber, turnOn )
.then( function() {
winston.info( sprintf( '%s: turned %s', self.displayName, state ) );
return true;
} )
.catch( function( error ) {
winston.info( sprintf( '%s: error while turning %s => %s', self.displayName, state, error ) );
return false;
} );
}
'return true' 和 'return false' 语句是我试图结束 Promise 链的尝试。但它不起作用,我仍然收到警告。
这让我觉得这是一个更普遍的问题的具体示例:如何从基于 Promise 的模型转移到传统的阻塞代码?
编辑
回答cmets的几个问题...
我正在使用蓝鸟。
zWave.onOff() 返回一个承诺。
Switch.onOff() 和 zWave.onOff() 是不同类中的不同函数。
所有代码都是javascript。
编辑 2
我相信我已经实现了 jfriend00 的建议,虽然我在 zWave.onOff() 函数中包含了一个 .catch() 处理程序,但我仍然收到相同的未处理承诺错误:
ZWave.prototype.onOff = function (nodeNumber, turnOn) {
var self = this;
var level = turnOn ? 255 : 0;
return self.requestAsync( sprintf( '/Run/devices[%d].instances[0].commandClasses[0x20].Set(%d)', nodeNumber, level ) )
.then( function( value ) {
resolve( value == 'null' );
} )
.catch( function( error ) {
reject( error );
} );
};
和
// function inside Switch class
this.onOff = function( turnOn ) {
var state = turnOn ? 'ON' : 'OFF';
var self = this;
return zWave.onOff( this.nodeNumber, turnOn ).reflect()
.then( function() {
winston.info( sprintf( '%s: turned %s', self.displayName, state ) );
return true;
} )
.catch( function( error ) {
winston.info( sprintf( '%s: error while turning %s => %s', self.displayName, state, error ) );
return false;
} );
}
这是警告的文本:
警告:在处理程序中创建了一个承诺,但没有从它返回 在 ZWave.requestAsync (/home/mark/XmasLights/zWaveRequest.js:19:12) 在 ZWave.onOff (/home/mark/XmasLights/zWaveRequest.js:93:17) 在 onOff (/home/mark/XmasLights/switch.js:42:22) 在 updateCron (/home/mark/XmasLights/switch.js:80:18) 在dailyUpdate (/home/mark/XmasLights/app.js:196:21) 在 /home/mark/XmasLights/app.js:134:58 在 processImmediate [as _immediateCallback] (timers.js:383:17)
抱歉,警告的格式化运行,我似乎无法让 stackoverflow 正确分隔行。
【问题讨论】:
-
您使用的是像
q或bluebird这样的Promise 库,还是这些只是普通的节点Promise?可能的答案大相径庭。 -
能否也添加 requestAsync 方法?
-
@acupajoe:如果他通过
var requestFn = bluebird.promisifyAll(require('some module'))导入的话他就不行了 -
没有从
this.onOff返回的Promise? ,例如,return zWave.onOff( this.nodeNumber, turnOn )?
标签: javascript node.js promise