如果我在 Kriskowal 的 q 中多次拒绝/解决会发生什么?

IT技术 javascript node.js promise q
2021-03-10 06:42:46

我正在研究 promises 模式并在 node.js 中使用 kriskowal 的 q,

有这个片段:

var deferred = Q.defer();
try {
    messageData = JSON.parse(message);
} catch (e) {
    global.logger.warn('Error parsing JSON message.');
    deferred.reject(e);
}
...
if (some_reason)
    deferred.resolve(something);
...
return deferred.promise;

如果解析器都失败并且some_reason为真怎么办?

执行是否会从拒绝到解决,并且在不同时间调用两个Promise的方法,从而产生错误?

我应该避免多次调用拒绝/解决吗?

2个回答

由于Promise只能解决一次(完成拒绝),第一个解决方案获胜并且任何进一步的调用都将被忽略。文档

在Promise已解决(即完成或拒绝)的所有情况下,该解决方案是永久性的且无法重置。如果Promise已经解决,则尝试调用 resolve、reject 或 notify 将是空操作。

我应该避免多次调用拒绝/解决吗?

您甚至可以设计您的应用程序,让两种方法相互“竞争”以解决延迟问题,但通常应避免这样做以减少读者的混淆。

我不知道比赛,我为此使用了 jQuery deferreds。例如,一旦用户单击或时间用完,就转到下一个屏幕。“以先到者为准”。我觉得奇怪的是,像 Kew.js 这样的库在尝试解决两次时实际上会抛出错误。:(
2021-04-21 06:42:46
@bfred.it:是的,你可以这样做。但是明确地做Q.race(getNextUserClick(), Q.timeout(…)).then(nextScreen)多次延迟和手动解决要好
2021-04-27 06:42:46
Race 很有趣,但不幸的是,kew.js 实际上没有。
2021-05-09 06:42:46
jsbin.com/gemepay/3/edit?js,console ; 通过这个例子,既然第一个 promise 解析为 1 ,那么为什么其他调用也解析为 1 ?由此我明白,一旦解决,其他 '.then()' 调用默认为第一次计算的值。
2021-05-10 06:42:46
@motan 不清楚您所说的“第一个Promise是什么意思您的代码中只有一个(相关的)promise p,并且该单个promise 确实有一个结果值。then一个Promise上安装了多少个回调并不重要——零、一个或多个——它们不会影响Promise的分辨率。
2021-05-13 06:42:46

原帖在这里

参见 github 要点:reuse_promise.js

/*
reuse a promise for multiple resolve()s since promises only resolve once and then never again
*/

import React, { useEffect, useState } from 'react'

export default () => {
    
    const [somePromise, setSomePromise] = useState(promiseCreator())
        
    useEffect(() => {
        
        somePromise.then(data => {
            
            // do things here
            
            setSomePromise(promiseCreator())
        })
        
    }, [somePromise])
}

const promiseCreator = () => {
    return new Promise((resolve, reject) => {
        // do things
        resolve(/*data*/)
    })
}