包装ajax电话

时间:2016-12-18 21:24:25

标签: 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 {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响应出现之前先订阅。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果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]
    });
});

答案 1 :(得分:1)

假设RxJS 5,用mergeMap替换最后一个select并返回一个新的observable:

bool getconchar( KEY_EVENT_RECORD& krec )
{
    DWORD cc;
    INPUT_RECORD irec;
    HANDLE h = GetStdHandle( STD_INPUT_HANDLE );

    if (h == NULL)
    {
        return false; // console not found
    }

    for( ; ; )
    {
        ReadConsoleInput( h, &irec, 1, &cc );
        if( irec.EventType == KEY_EVENT
            &&  ((KEY_EVENT_RECORD&)irec.Event).bKeyDown
            )//&& ! ((KEY_EVENT_RECORD&)irec.Event).wRepeatCount )
        {
            krec= (KEY_EVENT_RECORD&)irec.Event;
            return true;
        }
    }
    return false; //future ????
}

int main( )
{
    KEY_EVENT_RECORD key;
    for( ; ; )
    {
        getconchar( key );
        std::cout << "key: " << key.uChar.AsciiChar
            << " code:  " << key.wVirtualKeyCode << std::endl;
    }
}