【问题标题】:Promise resolver array does not workPromise 解析器数组不起作用
【发布时间】:2018-01-28 03:56:53
【问题描述】:

我正在使用以下代码来解析函数范围之外的promise

private promiseResolver: ()=>void;

getPromise(): Promise<any> {

    return new Promise((resolve, reject) => {
            this.promiseResolver = resolve;
        });
}

continueProcessing() {
        this.promiseResolver();
}

它工作正常,但是我想创建一个 promiseResolver 数组来解决多个承诺。

private promiseResolvers: [()=>void];

getPromise(): Promise<any> {
    return new Promise((resolve, reject) => {
            this.promiseResolvers.push(resolve);
        });
}

continueProcessing() {
        this.promiseResolvers[0]();
}

getPromise() 函数的调用者在使用数组时不等待承诺解决。

是否可以创建这样的promise 解析器数组?

【问题讨论】:

  • 我不确定你想在这里实现什么,但你试过Promise.all()吗?
  • 确实,一个用例会很有帮助。我会非常谨慎地尝试像这样抽象承诺管理,这听起来有点像deferred . anti pattern
  • 如前所述,promiseResolver 是延迟反模式。考虑到问题有 rxjs 标签,你可以使用 observables/subjects 代替。
  • promiseResolvers 未初始化是一个错误,但就像 Nick Tomlin 和 @estus 所说的那样,这是一个反模式,它没有抛出错误,因此它没有报告根本原因。我会将其更改为可观察的。非常感谢。

标签: javascript typescript promise rxjs


【解决方案1】:

正如人们在 cmets 中所说,这是一种反模式,我 99% 的人认为这在您的项目中不是必需的。但如果你的项目在那 1% 中,那就有答案了

您可能也想做同样的事情,但像这样包装到“元”类中:

class Awaiter{
    constructor(){
        var resolve,
            reject,
            promise = new Promise((_, $) => { resolve = _; reject = $ });
        Object.assign(promise, { resolve, reject })
        return promise
    }
}

我看到你正在使用打字稿,所以这个类也有打字:

interface Awaiter<T = any> extends Promise<T>{
    resolve: (value?: T) => void
    reject: (reason?: any) => void
}

const Awaiter: {
    new(): Awaiter
    prorotype: Awaiter
}

所以,如您所见,没有必要使用数组。每个解析器和拒绝器都有自己的作用域。

例子:

const myAwaiter = new Awaiter;
(async () => {
    await myAwaiter;
    console.log('awaiter resolved')
})();
setTimeout(() => {
    myAwaiter.resolve()
}, 5000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多