32

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

有这个片段:

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为真怎么办?

执行是否会从resolve 到resolve 并在不同时间调用两个promise 的方法,从而产生错误?

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

4

2 回答 2

51

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

在所有承诺被解决的情况下(即履行或拒绝),解决方案是永久性的,不能被重置。如果 promise 已经解决,尝试调用 resolve、reject 或 notify 将是无操作的。

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

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

于 2013-08-13T20:24:01.777 回答
0

原帖在这里

参见 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*/)
    })
}
于 2021-02-19T13:21:14.057 回答