如果我在Kriskowal的q中多次拒绝/解决会怎么样?

时间:2013-08-13 19:32:42

标签: node.js promise q

我正在研究promises模式并使用kriskowal的q作为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 为真,该怎么办?

执行会从拒绝通过解析进行,并且会在不同时间调用promise的方法,从而产生错误吗?

我应该避免多次致电拒绝/解决吗?

2 个答案:

答案 0 :(得分:43)

由于promises can only resolve once(要么已完成已拒绝),第一个分辨率将获胜,并且将忽略任何进一步的调用。来自the docs

  

在承诺得到解决(即已履行或拒绝)的所有情况下,解决方案都是永久性的,无法重置。如果承诺已经解决,尝试呼叫解决,拒绝或通知将是无操作。

  

我应该避免多次致电拒绝/解决吗?

您甚至可以设计您的应用程序,让两种方法相互“竞争”以解决延迟,但一般情况下应避免这种方法以减少读者的混淆。

答案 1 :(得分:0)

原帖here

see github gist: 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*/)
    })
}