Javascript 从回调中获取 Promise 结果

标签 javascript asynchronous callback promise

如何通过 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));
});

我知道这个解决方案行不通,但我不知道如何通过 Promise 获取函数外部的数据。

最佳答案

由于你的回调被回调了多次,所以比 promisifying your API 稍微复杂一些。通过将 resolve/reject 作为回调传递给您的方法。

最后一次调用后,您将使用结果数组调用 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"

关于Javascript 从回调中获取 Promise 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30060864/

相关文章:

javascript - MapMyIndi​​a 未完全加载,但当我打开开发人员工具(按 f12)时,它正在运行

javascript - 如何在 google map api 中更改缩放更改的标记

javascript - 在谷歌浏览器扩展程序manifest.json中启用跨域权限

asynchronous - 使用 tornado.httpclient.AsyncHTTPClient.fetch() 发出带有参数的 GET 请求

javascript - 返回未定义的 Node.js npm mssql 函数

javascript - 如何在使用回调完成另一个函数后调用一个函数?

javascript - 使用 Javascript 选择最后一个自动换行符后的最后一行

javascript - 使用 USGSOverlay 异步加载 GoogleMap

javascript - 异步函数中的 Promisereject() 导致 “Uncaught (in promise)” 警告

c++ - glutKeyboardfunc() 回调函数参数