【发布时间】:2019-10-15 09:34:18
【问题描述】:
我正在处理一些使用 RPC/YUI 库处理网络请求的旧代码。它本质上是创建标签来处理网络请求。这些都没有 Promise。另外,由于 IE11 支持,我们不能使用原生 Promise 对象。我们的构建过程不使用任何 NPM 依赖项,因此我们不能使用任何 babel 相关的 polyfill。
我正在努力修复一个错误,即每次另一个函数调用相同的函数时,参数ignoreError 都会被覆盖......显然!我们有多个函数调用这个网络请求函数库。有时我们想忽略错误,有时我们不想。
存储发出的多个请求及其各自的错误回调以便调用适当的项目的理想方法是什么?
示例:
var rpcUrl,
rpcRetries,
rpcIgnoreError;
// main function that sets some globals:
rpc: function(url, retries, ignoreError) {
rpcUrl = url;
rpcRetries = retries;
rpcIgnoreError = ignoreError;
this.doRpc();
},
// calls the YUI library to initialize network script:
doRpc: function() {
YAHOO.util.Get.script(rpcUrl, {
onFailure: function() {
this.callbackError(true);
},
timeout: 55000
});
},
// YUI callback
callbackError: function(retry) {
if (retry && rpcRetries > 0) {
rpcRetries = rpcRetries - 1;
this.doRpc();
} else {
// ** how do i know this error handling is for the script which failed?
if (!rpcIgnoreError) {
this.populateFormStatus(6);
}
}
},
现在,我们有多个函数调用rpc(),例如:
sendConfig: function() {
this.rpc(urlForEndpoint, 3, true);
},
sendUser: function() {
this.rpc(urlForEndpoint, 3, false);
},
sendWidget: function() {
this.rpc(urlForEndpoint, 3, false);
},
我担心创建一个回调数组并不能保证每个项目都由其各自的处理程序处理。
我可以做一些事情,比如创建一个地图常量:
var RPC_ERR_CB = {
sendConfig: false,
sendUser: true,
sendWidget: true
};
//然后在onFailure回调中,可以读取到脚本标签的src:
...
doRpc: function() {
YAHOO.util.Get.script(rpcUrl, {
onFailure: function() {
var hasCB = Object.keys(RPC_ERR_CB).some(function(item) {
return arguments[0].src.indexOf(RPC_ERR_CB[item]) <= 0;
});
if (hasCB) {
this.callbackError(true);
}
},
timeout: 55000
});
},
希望这是有道理的...谢谢!
【问题讨论】:
-
您是否需要等到每个呼叫都已解决? - 他们是顺序解决还是并行解决
-
不,我们不需要这个功能。
-
“我担心制作一个回调数组并不能保证每个项目都由其各自的处理程序处理。”是什么意思?据我所知,只有一个处理程序 (
callbackError)。 -
你可以简单地做
this.doRpc (ignoreError)和this.callbackError (true, ignoreError) -
但是您的所有变量都存在相同的问题,您可能希望将 url 与对象内的这些选项一起存储,将其保存在类实例中的某个位置,或者按照您在额外查找。
标签: javascript rpc yui