看下面代码:getSupportedDeliveryModes():Observable{this.checkoutStore.pipe(select(getProcessStateFactory(SET_SUPPORTED_DELIVERY_MODE_PROCESS_ID)))),tap(([,loadingState])=>{if(!(loadingState.loading||loadingState.success||loadingState.error)){this.loadSupportedDeliveryModes();}}),pluck(0),shareReplay({bufferSize:1,refCount:true}));}调用withLatestFrom的Observable对象,主导向下游观察者产生数据。作为参数调用的Observable对象只能贡献新的数据,不能控制数据产生的时机。也就是说,在上面的Spartacus例子中,CheckoutSelectors.getSupportedDeliveryModesObservable对象是下游数据生成的领导者,而select(getProcessStateFactory(SET_SUPPORTED_DELIVERY_MODE_PROCESS_ID)只是数据片段的贡献者。下图中第54行的语法是ancestor,祖先也是一个数组,但是各个元素的数据类型不一定要相同。第54行的loadingState表示从ngrx存储中获取的setDeliveryModeProcess的状态。第55行的语义是,如果状态为加载或成功或错误,则什么都不做,否则在第58行调用loadSupportedDeliveryModes以加载模式。这里我们巧妙地使用了withLatestFrom,将投放模式的加载状态引入到getSupportedDeliveryModes的交互中。让我们看另一个例子:action).pipe(withLatestFrom(this.multiCartService.getCart(action.payload.cartId)))),map(([action,cart])=>createFrom(mapping.eventasType,{...action.payload,cartCode:cart.code,saveCartName:cart.name,saveCartDescription:cart.description,...(cart.saveTime&&{saveTime:cart.saveTime}),})));这里调用的Observable对象的withLatestFrom类型为Action,包含一个string类型的字段和一个any类型的payload字段。贡献数据为withLatestFrom算子函数的入参,类型为146行this.multiCartService.getCart的返回参数,类型为Cart,如下图所示:管道运算符,也就是在149行代码中,地图的入参是祖先:[action,cart],两个元素的数据类型分别是:and:值得一提的是两者有本质区别结合Latest和withLatestFrom。在前一个调用中,所有参与计算的Observable都是地位平等的。只要有任何一个发生变化,combineLatest就会从所有输入的Observable对象中取出最后生成的数据,组合成一个数组数据类型,传递给下游。更多Jerry原创文章在这里:《王子熙》: