【问题标题】:Is it possible to have multiple thenable for same promise instance?同一个promise实例可以有多个thenable吗?
【发布时间】:2019-08-08 10:27:08
【问题描述】:

当我对单个 promise 对象有多个 thenable 函数时,它会起作用吗?在这种情况下,我不想嵌套。我想对同一个 promise 对象执行不同的操作。

var a = 0,
t = null,
promiseFun = function () {
    return new Ext.Promise(function (resolve, reject) {
        t = setInterval(function () {
                if (a == 1) {
                    resolve();
                    clearInterval(t);
                } else if (a == 2) {
                    reject();
                    clearInterval(t);
                }
            }, 1000);
    })
};

var promiseObj = promiseFun();
//handler one
promiseObj.then(function () {
    console.log('resolved 1')
}, function () {
    console.log('rejected 1')
}).then(function () {
    console.log('resolved Nest')
}, function () {
    console.log('rejected Nest')
});

//handler two- this is valid ?
promiseObj.then(function () {
    console.log('resolved 2')
}, function () {
    console.log('rejected 2')
});

//OUTPUT:

//resolved 1
//resolved 2
//resolved Nest

或者我需要包裹Deffered

【问题讨论】:

  • promiseObj.then() 需要一个带有参数的函数,这个函数在 Promise 解析时被调用,结果被传递。您似乎正在尝试传递自定义解析/拒绝处理程序;这不是模式的工作方式。第二个函数应该进入.catch()
  • @ChrisG - .then() 最多支持两个作为参数传递的函数。第二个函数(如果存在)是拒绝处理程序。大多数人使用.catch() 来代替,但也有一些用例将第二个函数用于.then()
  • @ChrisG - promiseObj.then() expects a single function 不,0、1 或 2 个参数是有效的(是 0)......第二个被“拒绝”......另外,你可以把任何东西作为参数,非函数被视为不存在......这就是.then(null, onrejectedFn) == .catch(onrejectedFn)
  • @jfriend00 和 Jaromanda X,我明白了,我应该在“纠正”人之前查一下 :)
  • 我似乎记得 .then(null, onresolved) 是出于某种原因在旧 Internet Explorer 中实现承诺的唯一方法......不喜欢 .catch 或其他东西 - 不记得了,但在我的自己的 Promise 实现,catch 写成Promise.prototype.catch = function (onRejected) { return this.then(null, onRejected); };

标签: javascript extjs promise


【解决方案1】:

当我为单个 promise 对象有多个 thenable 函数时它会起作用吗?

是的,这很好用。这称为分支而不是链接。

如果你有这个:

let p = somePromiseGeneratingFunction();
p.then(...).then(...);
p.then(...).then(...);

然后,您只需创建两个独立的承诺链,每个承诺链都会在 p 解析时启动。如果这是你想要的逻辑,那完全没问题。

您可以保证的一件事是,第一个 p.then() 处理程序将在第二个 p.then() 处理程序被调用之前被调用,但是如果任一链中还有进一步的异步操作,那么它们之后独立运行并且不会相互协调的时间更长。它们是独立且独立的 Promise 链,根据自己的异步操作的时间运行。这就是为什么它被称为“分支”。一条链分叉成两条链。

有关该主题的更多讨论,请参阅Is there a difference between promise.then.then vs promise.then; promise.then

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 2014-10-30
    • 2014-08-11
    • 2012-10-24
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多