【问题标题】:How can i store Promise instead of Deferred我如何存储 Promise 而不是 Deferred
【发布时间】:2015-08-19 21:24:14
【问题描述】:

我有一段代码,它通过调度带有回调 ID 的请求,并将 Deferred 存储在数组中来与 iOS 原生层通信。那么当回调到来时,我们可以解决或者拒绝这个Deferred

我的代码:

jsGate = (function () {
    function jsGate() {}
    jsGate._messageCount = 0;
    jsGate._callbackDeferreds = {};
    jsGate.dispatch = function (plugin, method, args) {
        var callbackID, d, message;
        callbackID = this._messageCount;
        message = {
            plugin: plugin,
            method: method,
            "arguments": args,
            callbackID: callbackID
        };
        send(message)
        this._messageCount++;
        d = new Deferred;
        this._callbackDeferreds[callbackID] = d;
        return d.promise;
    };

    jsGate.callBack = function (callbackID, isSuccess, valueOrReason) {
        var d;
        d = this._callbackDeferreds[callbackID];
        if (isSuccess) {
            d.resolve(valueOrReason[0]);
        } else {
            d.reject(valueOrReason[0]);
        }
        return delete this._callbackDeferreds[callbackID];
    };

    return jsGate;
})();

使用示例:

jsGate.dispatch("ReadLater", "fetchSomething", []).then(function (value) {
    return console.log(value);
});
return jsGate.dispatch("ReadLater", "asyncError", []).then(function (value) {
    return console.log(value);
}, function (reason) {
    return console.log("Failed: " + reason);
});

使用 A+ Promises 的最佳实践是什么?

【问题讨论】:

  • 你为什么把它存储在_callbackDeferreds
  • 我正在尝试提供iOS WKWebView和JS之间的双向通信,而iOS只能支持单向通信('发送')。 iOS 稍后会使用 callbackID 执行eval 来模拟双向通信。回调的 Swift 代码是 bridge.vc.webView.evaluateJavaScript("Goldengate.callBack(\(callbackID), \(success), \(Goldengate.toJSON([reasonOrValue])))", completionHandler: nil) 整个 Swift 文件在这里:github.com/radex/Goldengate/blob/master/Goldengate/…
  • Nolan Lawson 建议揭示构造函数方法,描述为here。我去看看
  • 我不认为有任何解决办法 - 你必须使用 resolve 和 reject 方法来存储 Deferred 或类似 Deferred 的东西。可以整理整体模式,但仅此而已。
  • 但如果send() 是你要修改的,那就完全是另一回事了。你可以给它传递一个回调函数而不是一个回调ID,或者更好的是让它返回一个promise。

标签: javascript promise deferred


【解决方案1】:

经过长期研究:没有奇怪的 hack 就没有干净的方法可以做到这一点。 DeferredPromise 之间的主要区别在于我们不能从外部操作 Promise 结果。一般来说 - 这是一个很好的方法,但在这种特殊情况下,我们需要这个功能,所以 - 我们必须坚持使用Deferred

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2016-09-03
    • 2018-01-10
    • 2012-11-03
    • 2020-03-05
    • 2022-12-01
    相关资源
    最近更新 更多