如何通过承诺从回调函数中获取数据? 这可能吗?
这是我的代码:
var bricklets = [];
var ipcon = new Tinkerforge.IPConnection();
pcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) {
if (enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) {
console.log('');
return;
}
bricklets.push(new Bricklet(uid, deviceIdentifier, connectedUid));
});
我知道这个解决方案不起作用,但我不知道通过承诺将数据传递到函数之外。
答案 0 :(得分:2)
由于您的回调被多次回调,因此通过将resolve
/ reject
作为回调传递给您的方法,它比promisifying your API更复杂。
在最后一次通话结束后,您可以使用结果数组调用resolve
:
var promise = new Promise(function(resolve, reject) {
var bricklets = [];
var ipcon = new Tinkerforge.IPConnection();
pcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) {
if (enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) {
return resolve(bricklets); // when done
// ^^^^^^^
} // else if some error happened
// return reject(err);
bricklets.push(new Bricklet(uid, deviceIdentifier, connectedUid));
});
});
现在,你没有真正得到你的数据"退出回调"从某种意义上说它们将被同步返回(promises are still async callbacks),但是你得到的数据 promise
比使用回调更容易使用。
您可能会像
一样使用它promise.then(function(bricklets) {
console.log(bricklets);
… // do more
}); // returns a new promise for the result of "do more"