@@ -2,6 +2,7 @@ import {get_input_item_from_type} from "./input/index"
22import { InputItem } from "./input/base" ;
33import { t } from "../i18n" ;
44import { AfterCurrentOutputWidgetShow } from "../handlers/output" ;
5+ import { randomid } from "../utils" ;
56
67
78let name2input : { [ k : string ] : InputItem } = { } ;
@@ -16,16 +17,14 @@ export function PinUpdate(name: string, attributes: { [k: string]: any }) {
1617 name2input [ name ] . update_input ( { attributes : attributes } ) ;
1718}
1819
19- let onchange_callbacks : { [ name : string ] : ( ( val : any ) => void ) [ ] } = { } ; // name->[]
20+ let onchange_callbacks : { [ name : string ] : { [ callback_id : string ] : ( ( val : any ) => void ) } } = { } ; // name->{callback_id->callback}
2021
2122export function WaitChange ( names : string [ ] , timeout : number ) {
2223 let promises = [ ] ;
24+ let callback_ids : { [ name : string ] : string } = { } ;
2325 for ( let name of names ) {
24- if ( ! ( name in onchange_callbacks ) )
25- onchange_callbacks [ name ] = [ ] ;
26-
2726 promises . push ( new Promise ( resolve => {
28- onchange_callbacks [ name ] . push ( value => {
27+ callback_ids [ name ] = register_on_change ( name , value => {
2928 resolve ( { 'name' : name , 'value' : value } )
3029 } ) ;
3130 } ) ) ;
@@ -37,13 +36,29 @@ export function WaitChange(names: string[], timeout: number) {
3736 } , timeout * 1000 ) ;
3837 } ) ) ;
3938 }
40- return Promise . race ( promises ) ;
39+ return Promise . race ( promises ) . then ( ( val ) => {
40+ for ( let name of names ) {
41+ let callback_id = callback_ids [ name ] ;
42+ delete onchange_callbacks [ name ] [ callback_id ] ;
43+ }
44+ return val ;
45+ } ) ;
46+ }
47+
48+ function register_on_change ( name : string , callback : ( val : any ) => void ) : string {
49+ let callback_id = randomid ( 10 ) ;
50+ if ( ! ( name in onchange_callbacks ) )
51+ onchange_callbacks [ name ] = { } ;
52+ onchange_callbacks [ name ] [ callback_id ] = callback ;
53+ return callback_id ;
4154}
4255
4356function trigger_onchange_event ( name : string , value : any ) {
44- let resolve_list = onchange_callbacks [ name ] || [ ] ;
45- for ( let resolve of resolve_list )
57+ let resolve_list = onchange_callbacks [ name ] || { } ;
58+ Object . keys ( resolve_list ) . forEach ( callback_id => {
59+ let resolve = resolve_list [ callback_id ] ;
4660 resolve ( value ) ;
61+ } )
4762}
4863
4964export let PinWidget = {
0 commit comments