我正在研究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的方法,从而产生错误吗?
我应该避免多次致电拒绝/解决吗?
答案 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*/)
})
}