Javascript从回调获得承诺结果

时间:2015-05-05 18:45:29

标签: javascript asynchronous callback promise

如何通过承诺从回调函数中获取数据? 这可能吗?

这是我的代码:

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

我知道这个解决方案不起作用,但我不知道通过承诺将数据传递到函数之外。

1 个答案:

答案 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"