Javascript 我怎样才能存储承诺而不是延迟

Javascript 我怎样才能存储承诺而不是延迟,javascript,promise,deferred,Javascript,Promise,Deferred,我有一段代码,它通过调度带有回调ID的请求,并将延迟的存储在数组中,与iOS本机层通信。然后,当回调到来时,我们可以解决或拒绝这个延迟的 我的代码: jsGate = (function () { function jsGate() {} jsGate._messageCount = 0; jsGate._callbackDeferreds = {}; jsGate.dispatch = function (plugin, method, args) {

我有一段代码,它通过调度带有回调ID的请求,并将
延迟的
存储在数组中,与iOS本机层通信。然后,当回调到来时,我们可以解决或拒绝这个
延迟的

我的代码:

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+承诺的最佳实践是什么?

经过长时间的研究:没有奇怪的黑客,没有干净的方法可以做到这一点。
延迟
承诺
之间的主要区别在于,我们不能从外部操纵
承诺
的结果。总的来说,这是一种很好的方法,但在这种特定情况下,我们需要这种功能,因此,我们必须坚持使用
延迟

为什么要将其存储在
\u callbackdelivereds
?我试图在iOS WKWebView和JS之间提供双向通信,iOS只能支持单向通信(“发送”)。iOS稍后将使用callbackID进行
eval
以模拟双向通信。用于回调的Swift代码是
bridge.vc.webView.evaluateJavaScript(“Goldengate.callback(\(callbackID),\(success),\(Goldengate.toJSON([reasonOrValue])”,completionHandler:nil)
整个Swift文件在这里:Nolan Lawson建议的构造函数方法,描述。我会检查一下,我不认为有任何办法可以解决这个问题——你必须使用resolve和reject方法来存储延迟或延迟的内容。整个模式可以被整理,但仅此而已。但是如果
send()
是您要修改的,那就完全是另一回事了。您可以给它传递一个回调函数而不是callbackID,或者更好的是,让它返回一个承诺。