Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 包装ajax调用_Javascript_Ajax_Rxjs - Fatal编程技术网

Javascript 包装ajax调用

Javascript 包装ajax调用,javascript,ajax,rxjs,Javascript,Ajax,Rxjs,我有一个代码,它将在select函数中生成一个ajax请求 oSelect .select(function (oEvent) { return oEvent.getSource(); }) .select(function (oControl) { let oItem = oControl.getSelectedItem(); let aKeys = oItem.getKey().split("/"); return

我有一个代码,它将在select函数中生成一个ajax请求

  oSelect
    .select(function (oEvent) {
      return oEvent.getSource();
    })
    .select(function (oControl) {
      let oItem = oControl.getSelectedItem();
      let aKeys = oItem.getKey().split("/");
      return {plant: aKeys[0], wc: aKeys[1]};
    })
    .select(function (oSelectedItem) {

      let oModel = self.getModel("weightProtocolService");
      let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
      let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);

      oModel.read("/CostCenterCalendarSet", {
        success: function (oData, oResponse) {
          return Rx.Observable.from(oResponse.data.results);

        },
        error: function (oError) {
          return Rx.Observable.throw(oError);
        },
        filters: [oPlantFilter, oWcFilter]
      });
    })
    .subscribe(function (oKey) {
      console.log(oKey);
    },
    function (err) {
      jQuery.sap.log.fatal(err);
    });
我这里的问题是,它将在ajax响应出现之前首先订阅


如何解决此问题?

如果
oModel.read
返回承诺,则您可以简单地执行以下操作:

....
return Observable.fromPromise(oModel.read("/CostCenterCalendarSet", {
        filters: [oPlantFilter, oWcFilter]
    })
);


如果
oModel.read
没有返回承诺,那么您需要一个自定义的可观察的:

....
return Observable.create(function(observer) {
    oModel.read("/CostCenterCalendarSet", {
        success: function (oData, oResponse) {
            return observer.onNext(oResponse.data.results);  // or just .next(..) in case you are using rxjs5+
        },
        error: function (oError) {
            return observer.onError(oError); // or just .error(..) in case you are using rxjs5+
        },
        filters: [oPlantFilter, oWcFilter]
    });
});
.mergeMap(function (oSelectedItem) {

  let oModel = self.getModel("weightProtocolService");
  let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
  let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);

  return new Observable(observer => {
    oModel.read("/CostCenterCalendarSet", {
      success: function (oData, oResponse) {
        observer.next(oResponse.data.results);
      },
      error: function (oError) {
        observer.error(oError);
      },
      filters: [oPlantFilter, oWcFilter]
    });
  });
})

如果
oModel.read
返回一个承诺,那么您只需执行以下操作:

....
return Observable.fromPromise(oModel.read("/CostCenterCalendarSet", {
        filters: [oPlantFilter, oWcFilter]
    })
);


如果
oModel.read
没有返回承诺,那么您需要一个自定义的可观察的:

....
return Observable.create(function(observer) {
    oModel.read("/CostCenterCalendarSet", {
        success: function (oData, oResponse) {
            return observer.onNext(oResponse.data.results);  // or just .next(..) in case you are using rxjs5+
        },
        error: function (oError) {
            return observer.onError(oError); // or just .error(..) in case you are using rxjs5+
        },
        filters: [oPlantFilter, oWcFilter]
    });
});
.mergeMap(function (oSelectedItem) {

  let oModel = self.getModel("weightProtocolService");
  let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
  let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);

  return new Observable(observer => {
    oModel.read("/CostCenterCalendarSet", {
      success: function (oData, oResponse) {
        observer.next(oResponse.data.results);
      },
      error: function (oError) {
        observer.error(oError);
      },
      filters: [oPlantFilter, oWcFilter]
    });
  });
})

假设RxJS 5,将最后一个select替换为mergeMap,并返回一个新的可观察对象:

....
return Observable.create(function(observer) {
    oModel.read("/CostCenterCalendarSet", {
        success: function (oData, oResponse) {
            return observer.onNext(oResponse.data.results);  // or just .next(..) in case you are using rxjs5+
        },
        error: function (oError) {
            return observer.onError(oError); // or just .error(..) in case you are using rxjs5+
        },
        filters: [oPlantFilter, oWcFilter]
    });
});
.mergeMap(function (oSelectedItem) {

  let oModel = self.getModel("weightProtocolService");
  let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
  let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);

  return new Observable(observer => {
    oModel.read("/CostCenterCalendarSet", {
      success: function (oData, oResponse) {
        observer.next(oResponse.data.results);
      },
      error: function (oError) {
        observer.error(oError);
      },
      filters: [oPlantFilter, oWcFilter]
    });
  });
})

假设RxJS 5,将最后一个select替换为mergeMap,并返回一个新的可观察对象:

....
return Observable.create(function(observer) {
    oModel.read("/CostCenterCalendarSet", {
        success: function (oData, oResponse) {
            return observer.onNext(oResponse.data.results);  // or just .next(..) in case you are using rxjs5+
        },
        error: function (oError) {
            return observer.onError(oError); // or just .error(..) in case you are using rxjs5+
        },
        filters: [oPlantFilter, oWcFilter]
    });
});
.mergeMap(function (oSelectedItem) {

  let oModel = self.getModel("weightProtocolService");
  let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
  let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);

  return new Observable(observer => {
    oModel.read("/CostCenterCalendarSet", {
      success: function (oData, oResponse) {
        observer.next(oResponse.data.results);
      },
      error: function (oError) {
        observer.error(oError);
      },
      filters: [oPlantFilter, oWcFilter]
    });
  });
})