【问题标题】:Use native promise in protractor在量角器中使用原生承诺
【发布时间】:2017-07-27 10:09:28
【问题描述】:
有没有办法使用量角器filter,它接受一个返回量角器自己的 Promise 类型的函数,以及我自己的返回本机 Promise 的函数?
const myFilter = async(e: ElementFinder): Promise<boolean> => {
...
}
myElements.filter(myFilter)
这会引发 TypeScript 编译错误
TS2345:'(e: ElementFinder) => >Promise' 类型的参数不可分配给'(element: >ElementFinder, index?: number) => boolean | 类型的参数承诺'。
类型“Promise”不可分配给类型“boolean |承诺'。
类型“Promise”不可分配给类型“promise.Promise”。
“Promise”类型中缺少属性“cancel”。
顺便说一句,我不能自己创建量角器的承诺,因为弃用 (https://github.com/SeleniumHQ/selenium/issues/2969)
【问题讨论】:
标签:
typescript
protractor
【解决方案1】:
好的,如果这仍然相关,我必须再次进行测试,这一次我立即找到了解决方案。
这些助手打开了protractor.promise.Promise 和本机Promise 之间的桥梁。
const toNativePromise = <T = void>(p: protractor.promise.Promise<T>): Promise<T> => {
return new Promise((res, rej) => {
p.then(res).catch(rej)
})
}
const toProtractorPromise = <T = void>(native_promise: Promise<T>): protractor.promise.Promise<T> => {
const deferred = protractor.promise.defer<T>();
const protractorPromise = deferred.promise;
native_promise.then(deferred.fulfill).catch(deferred.reject)
return protractorPromise
}
无论如何,为了解决你最初的问题,你可以这样写:
const myFilter = async(e: ElementFinder): Promise<boolean> => { ... }
const myFilterForProtractor = (e) => toProtractorPromise(myFilter(e))