Javascript 作为承诺的回调数组?

Javascript 作为承诺的回调数组?,javascript,rpc,yui,Javascript,Rpc,Yui,我正在使用RPC/YUI库处理一些旧的遗留代码来处理网络请求。它本质上创建标记来处理网络请求。这些没有承诺。另外,由于IE11的支持,我们不能使用本机承诺对象。我们的构建过程不使用任何NPM依赖项,因此我们不能使用任何与巴别塔相关的多边形填充 我正在解决一个bug,即每当另一个函数调用同一个函数时,ignoreError参数就会被覆盖……显然!我们有多个函数调用此网络请求函数库。有时我们想忽略错误,有时我们不想 存储发出的多个请求及其各自的错误回调以调用相应项的理想方式是什么 例如: var r

我正在使用RPC/YUI库处理一些旧的遗留代码来处理网络请求。它本质上创建标记来处理网络请求。这些没有承诺。另外,由于IE11的支持,我们不能使用本机承诺对象。我们的构建过程不使用任何NPM依赖项,因此我们不能使用任何与巴别塔相关的多边形填充

我正在解决一个bug,即每当另一个函数调用同一个函数时,
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
  });
},
。。。
doRpc:function(){
YAHOO.util.Get.script(rpcUrl{
onFailure:function(){
var hasCB=Object.keys(RPC\u ERR\u CB).some(函数(项){

返回参数[0].src.indexOf(RPC_ERR_CB[item])您可以将值传递到
doRpc
,然后可以将其传递到
callbackError
或在
doRpc
中处理(就像最后的示例代码)。这将防止全局变量在您身上发生变化。

如果您无法使用Promises或ES6类,您的选择将变得有点有限。如果可能,我建议您在获得Babel Transfilation过程时咬紧牙关,这样您就可以利用新功能,而无需放弃IE11支持

但现在,理想情况下,您不希望跟踪某个全局变量中的每个请求。您可以通过将每个请求创建为自包含对象来独立处理每个事务:

函数RpcRequest(url、重试、忽略错误){
this.url=url
this.retries=重试
this.ignoreError=ignoreError
}
RpcRequest.prototype.send=函数(){
YAHOO.util.Get.script(this.url{
onFailure:function(){
此参数为.callbackError(true);
},
超时:55000
});
}
RpcRequest.prototype.callbackError=函数(重试){
如果(重试&&this.retries>0){
this.retries=this.retries-1;
这个。send();
}否则{
如果(!this.ignoreError){
// ...
}
}
}
//在其他地方,发起一个请求
var requestOne=new RpcRequest(“http://blah“,3,错)
requestOne.send()
我在查看您的代码时注意到:创建请求的代码不知道请求是否成功。当您出现错误时,调用上下文对该错误一无所知。我查看了您提到的库,它似乎有一些上下文可以传递

如果我稍微重写一下,我会这样做,将错误冒泡到您的调用上下文中:

RpcRequest.prototype.send=函数(回调){
YAHOO.util.Get.script(this.url{
onFailure:函数(上下文){
if(this.ignoreError){
context.ignoredError=true
回调(null,上下文);
返回;
}
var retError=新错误('Failure do something!');
retError.context=上下文;
回调(retError);
},
onSuccess:函数(上下文){
回调(null,上下文);
},
超时:55000
});
}
//代码中的其他地方。。。
sendWidget:function(){
var请求=新的RpcRequest(urlForEndpoint,3,false)
发送(函数(错误、结果){
如果(错误){
console.error('在执行小部件操作时失败:',err.context);
//甚至可能:
//犯错误;
返回;
}
如果(result.ignoredError){
console.warn('忽略小部件上的错误:',结果);
返回;
}
log('widget事件成功!',result);
})
}

您需要等到每个调用都已解决吗?-它们是按顺序解决还是并行解决?不,我们不需要此功能。您所说的“我关心的是生成一个回调数组并不能保证每个项目都由其各自的处理程序处理”是什么意思?据我所知,只有一个处理程序(
callbackError
)。您只需执行
this.doRpc(ignoreError)
this.callbackError(true,ignoreError)
但是您的所有变量都有相同的问题,您可能希望将url与对象中的这些选项一起存储,将其保存在类实例中的某个位置,或者按照您在额外查找中的建议。