而所有Promise.all关于如何等待所有承诺的问题,但我想走另一条路——当任何承诺失败时,停止其他承诺,甚至停止整个脚本。
这是一个简短的例子来说明:
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'resolve1');
}).then(a => { console.log('then1'); return a; });
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 2000, 'reject2');
}).then(a => { console.log('then2'); return a; });
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'resolve3');
}).then(a => { console.log('then3'); return a; });
Promise.all([promise1, promise2, promise3])
.then(values => { console.log('then', values); })
.catch(err => { console.log('catch', err); throw err; });
// results:
// …Run Code Online (Sandbox Code Playgroud)我在firebase上的数据使用了许多具有字符串类型的字段,但实际上是枚举值(我在验证规则中检查).要按照指南将数据下载到我的Android应用程序中,该字段必须是基本字段String.我知道我可以使用枚举的第二个(排除的)字段解决这个问题,并根据字符串值设置此字段.一个简短的例子:
class UserData : BaseModel() {
val email: String? = null
val id: String = ""
val created: Long = 0
// ... more fields omitted for clarity
@Exclude
var weightUnitEnum: WeightUnit = WeightUnit.KG
var weightUnit: String
get() = weightUnitEnum.toString()
set(value) { weightUnitEnum = WeightUnit.fromString(value) }
}
enum class WeightUnit(val str: String) {
KG("kg"), LB("lb");
override fun toString(): String = str
companion object {
@JvmStatic
fun fromString(s: String): WeightUnit = WeightUnit.valueOf(s.toUpperCase())
}
}
Run Code Online (Sandbox Code Playgroud)
现在,虽然这有效,但它并不是很干净:
enum …我正在尝试编写一个简单的方法装饰器,该装饰器在调用原始方法之前执行一些简单的逻辑。我可以找到的所有示例都归结为最后调用originalMethod.apply(this, args)-但在中noImplicitThis启用时tsconfig.json,出现以下错误:
[eval].ts(1,224): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
Run Code Online (Sandbox Code Playgroud)
我尝试通过致电解决此问题originalMethod.apply(this as any, args),但错误仍然存在。
问题:在不禁用整个项目的情况下,是否有任何变通办法来调用原始方法noImplicitThis?
最小示例-适用于noImplicitAny残疾人士:
function logBeforeCall1(): originalMethodDecorator {
return function(
target: any,
propertyKey: string | symbol,
descriptor: PropertyDescriptor,
): PropertyDescriptor {
const originalMethod = descriptor.value;
descriptor.value = (...args: any[]) => {
console.log('hello!');
return originalMethod.apply(this, args);
};
return descriptor;
};
}
class Test1 {
private num: …Run Code Online (Sandbox Code Playgroud) TL; DR:启用了proguard时,尽管使用了应保留所有这些属性的proguard配置,但在使用反射时,我的属性看起来是私有的,不可为空且没有注释。
我有一些data class具有公共属性的简单es,可以在我的Android应用中用作数据模型。稍后,当对所述类进行泛型[反]序列化时,我会像这样过滤属性列表:
val properties = instance::class.memberProperties
.filter { it.visibility == KVisibility.PUBLIC } // && some other conditions, unrelated here
.filterIsInstance<KMutableProperty<*>>()
Run Code Online (Sandbox Code Playgroud)
它可以在我的调试版本上正常工作(我是说它选择了我想要的属性)。但是,在进行发布构建时,如果激活了 proguard,则结果为空。为了检查原因,我记录了有关一个类的属性的所有相关信息-证明了它们的visibility字段读取PRIVATE(所有其他属性与调试版本相同)。
我已经在proguard config中设置了一行来保留所有模型:
-keepclassmembers class * extends com.models.package.name.BaseModel { *; }
Run Code Online (Sandbox Code Playgroud)
我之前尝试过此方法,但结果相同:
-keep class com.models.package.name.** { *; }
Run Code Online (Sandbox Code Playgroud)
保护者为何/如何影响财产可视性?我应该以某种方式修改配置吗?还是我在这里想念其他东西?
更新:似乎并不是唯一的可见性。prop.returnType.isMarkedNullable也不起作用,它返回false声明为可空的属性。即使我要求proguard保留注释,注释也似乎会丢失。有什么办法可以解决此问题?这几乎使我的工作两周没用了...
android ×2
kotlin ×2
decorator ×1
es6-promise ×1
firebase ×1
java ×1
javascript ×1
proguard ×1
promise ×1
typescript ×1