【发布时间】: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