diff --git a/wasm/channels.go b/wasm/channels.go
index 61e2012a4a2f875895ee2333d2c0202fd9b43c51..f93a95c5498f107000b7dcfd8c6f17d9d969a60e 100644
--- a/wasm/channels.go
+++ b/wasm/channels.go
@@ -229,31 +229,33 @@ func LoadChannelsManager(_ js.Value, args []js.Value) interface{} {
 //  - args[1] - Bytes of a private identity ([channel.PrivateIdentity]) that is
 //    generated by [GenerateChannelIdentity] (Uint8Array).
 //
-// Returns:
-//  - Javascript representation of the [ChannelsManager] object.
-//  - Throws a TypeError if initialising indexedDb or created the new channel
-//    manager fails.
+// Returns a promise:
+//  - Resolves to a Javascript representation of the [ChannelsManager] object.
+//  - Rejected with an error if loading indexedDb or the manager fails.
 func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} {
 	privateIdentity := utils.CopyBytesToGo(args[1])
 
-	emBuilder := func(path string) channels.EventModel {
-		em, err := indexedDb.NewWasmEventModel(path)
-		if err != nil {
-			utils.Throw(utils.TypeError, err)
-			return nil
+	promiseFn := func(resolve, reject func(args ...interface{}) js.Value) {
+		emBuilder := func(path string) channels.EventModel {
+			em, err := indexedDb.NewWasmEventModel(path)
+			if err != nil {
+				reject(utils.JsTrace(err))
+				return nil
+			}
+
+			return em
 		}
 
-		return em
-	}
-
-	cm, err := bindings.NewChannelsManagerGoEventModel(
-		args[0].Int(), privateIdentity, emBuilder)
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
+		cm, err := bindings.NewChannelsManagerGoEventModel(
+			args[0].Int(), privateIdentity, emBuilder)
+		if err != nil {
+			reject(utils.JsTrace(err))
+		} else {
+			resolve(newChannelsManagerJS(cm))
+		}
 	}
 
-	return newChannelsManagerJS(cm)
+	return utils.CreatePromise(promiseFn)
 }
 
 // LoadChannelsManagerWithIndexedDb loads an existing [ChannelsManager] using
@@ -270,28 +272,31 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} {
 //  - args[1] - The storage tag associated with the previously created channel
 //    manager and retrieved with [ChannelsManager.GetStorageTag] (string).
 //
-// Returns:
-//  - Javascript representation of the [ChannelsManager] object.
-//  - Throws a TypeError if loading the manager fails.
+// Returns a promise:
+//  - Resolves to a Javascript representation of the [ChannelsManager] object.
+//  - Rejected with an error if loading indexedDb or the manager fails.
 func LoadChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} {
-	emBuilder := func(path string) channels.EventModel {
-		em, err := indexedDb.NewWasmEventModel(path)
-		if err != nil {
-			utils.Throw(utils.TypeError, err)
-			return nil
+	promiseFn := func(resolve, reject func(args ...interface{}) js.Value) {
+		emBuilder := func(path string) channels.EventModel {
+			em, err := indexedDb.NewWasmEventModel(path)
+			if err != nil {
+				reject(utils.JsTrace(err))
+				return nil
+			}
+
+			return em
 		}
 
-		return em
-	}
-
-	cm, err := bindings.LoadChannelsManagerGoEventModel(
-		args[0].Int(), args[1].String(), emBuilder)
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
+		cm, err := bindings.LoadChannelsManagerGoEventModel(
+			args[0].Int(), args[1].String(), emBuilder)
+		if err != nil {
+			reject(utils.JsTrace(err))
+		} else {
+			resolve(newChannelsManagerJS(cm))
+		}
 	}
 
-	return newChannelsManagerJS(cm)
+	return utils.CreatePromise(promiseFn)
 }
 
 // GenerateChannel is used to create a channel a new channel of which you are