0

我有一個調用的OData如下刪除服務的刪除方法:同步觀測的HTTP調用

deleteValues = (key) => { 
    return new Promise((resolve, reject) => { 
     ... 

     this._referenceDataService.deleteReferenceData(etag, url).subscribe(
      data => { 
       resolve(data); 
      }, 
      error => { 
       this._notificationService.displayNotification(NotificationTypeEnum.Error, JSON.parse(error._body).error.message.value); 
       reject(error); 
      }, 
      () => { 
       this._notificationService.displayNotification(NotificationTypeEnum.Success, "Data deleted successfully."); 
      } 
     ); 
    }); 
} 

這裏deleteReferenceData方法返回從Angular2的http服務可觀察到的。

對於數據網格,如果我刪除3行,則對於單獨的行調用該方法3次。

我想要一個行爲,即使方法deleteValues被一個接一個地調用3次,只有當服務調用1完成時,服務纔會調用2行和3行。

回答

0

您可以先用隊列排隊後續服務調用,然後在每個服務調用完成時將其彈出。

它可能看起來像什麼......

private isDeleting; 
private deleteValuesQueue; 

deleteValues = (key) => { 
    this.deleteValuesQueue.unshift(key); 
    if(!isDeleting) this.runDeleteValues(this.deleteValuesQueue.pop()); 
} 

runDeleteValues = (key) => { 
    this.isDeleting = true; 
    // your actual delete function goes here... 

    // when the promise resolves or rejects and you want to execute the next item off the queue do 
    if(deleteValuesQueue.length > 0) this.runDeleteValues(this.deleteValuesQueue.pop()); 
    else this.isDeleting = false; 
} 

所以,這是怎麼回事這裏是你跟蹤你想刪除鍵的隊列中,如果你正在刪除一些東西。這由您從組件調用的deletedValues()進行管理。

當它被調用時,如果你沒有運行任何東西,繼續併發送它到真正的刪除。否則,將其放入隊列中。現在,當您運行真正的刪除操作時,最後請檢查隊列中是否有任何內容並運行這些刪除操作,或者說您已完成刪除並允許deleteValues調用下一個刪除操作。