Я сталкиваюсь с предупреждением Promise о неразрывной цепочке обещаний («обещание было создано в обработчике, но не было возвращено из него»). Я новичок в Promises и подозреваю, что я использую мышление, не основанное на событиях, когда я не должен быть. Но я не уверен, как действовать дальше. Все это находится в проекте nodejs.Завершение цепочки Promise
Я взаимодействую с сервером ZWave, чтобы включать и выключать источники света. Это взаимодействие принимает форму отправки HTTP-запросов на сервер, который управляет сетью ZWave. Я использую 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() Я пытаюсь превратить определенный свет, идентифицированный этим.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;
});
}
«возвращает истину» и «возвращать ложные» заявления моя попытка положить конец цепи Promise , Но он не работает, и я все еще получаю предупреждение.
Это наводит на меня как конкретный пример более общей проблемы: как вы переходите от модели на основе Promise к традиционному блокирующему коду?
Редактировать
Отвечая на несколько вопросов от комментариев ...
Я использую Bluebird.
zWave.onOff() возвращает обещание.
Switch.onOff() и zWave.onOff() - различные функции в отдельных классах.
Весь код - это javascript.
Edit 2
Я считаю, что я реализовал предложения jfriend00, хотя я включил обработчик .catch() в zWave.onOff() функции, но я все еще получаю ту же ошибку необработанного обещания:
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;
});
}
Вот текст предупреждения:
Warning: a promise was created in a handler but was not returned from it at ZWave.requestAsync (/home/mark/XmasLights/zWaveRequest.js:19:12) at ZWave.onOff (/home/mark/XmasLights/zWaveRequest.js:93:17) at onOff (/home/mark/XmasLights/switch.js:42:22) at updateCron (/home/mark/XmasLights/switch.js:80:18) at dailyUpdate (/home/mark/XmasLights/app.js:196:21) at /home/mark/XmasLights/app.js:134:58 at processImmediate [as _immediateCallback] (timers.js:383:17)
Прошу прощения за форматирование предупреждения, я не могу получить stackoverflow для правильного разделения строк.
Используете ли вы библиотеку Promise, например 'q' или' bluebird', или это просто простые обещания узла? Возможные ответы сильно различаются. –
Не могли бы вы также добавить метод requestAsync? – acupajoe
@acupajoe: он не сможет, если он импортирует его через 'var requestFn = bluebird.promisifyAll (require ('some module'))' –