@@ -13,6 +13,7 @@ use std::error::Error;
13
13
use std:: fmt:: { Debug , Formatter } ;
14
14
use std:: pin:: Pin ;
15
15
use std:: sync:: { Arc , Weak } ;
16
+ use std:: time:: Duration ;
16
17
use string_cache:: DefaultAtom ;
17
18
18
19
pub struct CachedJsObjectRef {
@@ -203,12 +204,36 @@ impl CachedJsPromiseRef {
203
204
}
204
205
205
206
pub fn get_promise_result_sync ( & self ) -> Result < Result < JsValueFacade , JsValueFacade > , JsError > {
206
- block_on ( self . get_promise_result ( ) )
207
+ let rx = self . get_promise_result_receiver ( ) ;
208
+ rx. recv ( ) . map_err ( |e| JsError :: new_string ( format ! ( "{e}" ) ) ) ?
209
+ }
210
+
211
+ pub fn get_promise_result_sync_timeout (
212
+ & self ,
213
+ timeout : Option < Duration > ,
214
+ ) -> Result < Result < JsValueFacade , JsValueFacade > , JsError > {
215
+ let rx = self . get_promise_result_receiver ( ) ;
216
+ let res = if let Some ( timeout) = timeout {
217
+ rx. recv_timeout ( timeout)
218
+ . map_err ( |e| JsError :: new_string ( format ! ( "{e}" ) ) )
219
+ } else {
220
+ rx. recv ( ) . map_err ( |e| JsError :: new_string ( format ! ( "{e}" ) ) )
221
+ } ;
222
+ res?
207
223
}
208
224
209
225
pub async fn get_promise_result (
210
226
& self ,
211
227
) -> Result < Result < JsValueFacade , JsValueFacade > , JsError > {
228
+ let rx = self . get_promise_result_receiver ( ) ;
229
+ rx. into_recv_async ( )
230
+ . await
231
+ . map_err ( |e| JsError :: new_string ( format ! ( "{e}" ) ) ) ?
232
+ }
233
+
234
+ pub fn get_promise_result_receiver (
235
+ & self ,
236
+ ) -> flume:: Receiver < Result < Result < JsValueFacade , JsValueFacade > , JsError > > {
212
237
let ( tx, rx) = flume:: bounded ( 1 ) ;
213
238
214
239
let tx1 = tx. clone ( ) ;
@@ -264,9 +289,7 @@ impl CachedJsPromiseRef {
264
289
}
265
290
} ) ;
266
291
267
- rx. recv_async ( )
268
- . await
269
- . map_err ( |e| JsError :: new_string ( format ! ( "{e}" ) ) ) ?
292
+ rx
270
293
}
271
294
}
272
295
0 commit comments