如何使用JSObjectMakeDeferredPromise从Swift中调用JavaScript并返回一个承诺的函数

问题描述 投票:0回答:1

我希望能够从JSContext调用一个返回诺言的函数。看来JSObjectMakeDeferredPromise是执行此操作的机制,但是文档很少,我不确定如何执行此操作。

任何人都可以提供在JSContext中调用返回诺言的函数的示例吗?

ios swift javascriptcore
1个回答
0
投票

WebKit是一个开源项目。我找到了与该功能有关的issue。此函数更喜欢为未处理的承诺拒绝抛出异常。

因此您不能使用该函数返回承诺。但是JavaScriptCore支持Promise关键字。我在使用Xcode 11.4.1的macOS上运行此脚本。效果很好。

const promiseA = new Promise( (resolve, reject) => {
    emulator.downloadWithHandler( (response) => {
        var isFinish = response["isFinish"];
        var isCancelled = response["isCancelled"];
        var date = response["date"];

        console.log("isFinish: " + isFinish);
        console.log("isCancelled: " + isCancelled);
        console.log("date: " + date);

        if (isFinish || isCancelled) {
            resolve(date);
        }
    });
});

[emulator.downloadWithHandler是本机回调,它将在后台DispatchQueue上返回。如果您想使用该承诺,请保留该承诺。调用context.objectForKeyedSubscript("promiseA")并使用JSManagedValue对其进行包装。

© www.soinside.com 2019 - 2024. All rights reserved.