【发布时间】:2020-01-17 17:09:47
【问题描述】:
我想拒绝一个我没有建立的承诺。也就是说,我读过的例子描述了类似的东西:
const sample = new Promise((resolve, reject) => {
setTimeout(() => {
reject('fail promise');
}, 1000);
});
1s 后拒绝sample。在我的情况下,我想要拒绝的承诺是作为外部 api 调用来的,那么我不能以这种方式拒绝。
我读过的另一种方法显示了如何将 promise 与使用 setTimeout 拒绝新 promise 的其他方法包装在一起。像这样的:
const timeout = new Promise(function(resolve, reject) {
setTimeout(resolve, 1000, 'one');
});
const sample = new Promise(function(resolve, reject) {
setTimeout(resolve, 5000, 'two');
});
return Promise.race([sample, timeout]);
在返回另一个承诺 1 秒后“拒绝”sample 的力量。这可以用来设置超时,但实际上它不会拒绝sample,只会返回另一个承诺,原始承诺会继续运行,直到它拒绝或自行解决。
我找不到如何正确拒绝没有库的承诺
【问题讨论】:
-
你不能拒绝别人的承诺。 Promise 是故意这样设计的。只有有权访问 Promise executor 函数的 Promise 的创建者才能解决或拒绝它。相反,使用他们的结果(无论它是什么),然后从中创建您自己的结果。
-
感谢您的回答,如果找到记录它的地方,请告诉我。事实上,我同意你的看法,因为 resolve/reject 方法只允许在创建 Promise 期间使用,但我会知道它是否记录在某个地方,我一直在寻找它,但我没有运气找到它。
-
好吧,resolve、reject 和promise 的函数被传递给promise 执行器,它们不是promise 上的方法。这意味着它们仅可用于执行器回调函数内部的代码,除非该回调以某种方式使它们可用于外部世界。我只能向您指出 Promise 文档,该文档显示了
resolve()和reject()函数的传递位置,您将看到它们仅可用于该回调。 Promise 上的公共方法是.then()、.catch()和.finally()。 -
仅供参考,在 99.9999% 的情况下,现有的 Promise 模型工作得很好,您可以从 executor 回调函数中解决或拒绝 Promise。偶尔,您希望能够从该回调之外控制自己的承诺。这个piece of code 展示了如何从常规承诺创建自己的延迟对象,然后可以从执行程序外部解决或拒绝该对象。你通常不需要这个,只能根据你自己的承诺来做。
-
90% 的答案都在问题中。 1. 确保 'timeout' Promise 被拒绝; 2.来自
Promise.race()返回的Promise链,即return Promise.race([sample, timeout]).then(data => doSomethingWith(data)).catch(error => /* timeout or other error from earlier in the chain will end up here */)。在实践中,.then().catch()很可能被链接到调用者中的函数调用。
标签: javascript ecmascript-6 promise es6-promise