- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一个函数,它遍历包含同步代码和 Promises
的 Generator
:
module.exports = {
isPromise (value) {
return typeof value === 'object' && value !== null && 'then' in value;
},
runGen (generatorFunc, startValue) {
let that = this,
i = 0;
function *iterator(resolve, reject) {
let runGeneratorFunc = generatorFunc(startValue),
yieldedOut = {done: false},
yieldIn;
while (!yieldedOut.done) {
console.log(i++, 'Ready for next iteration');
if (that.isPromise(yieldedOut.value)) {
console.log(i++, 'Pass promise to KeepIterating');
yieldIn = yield yieldedOut.value;
console.log(i++, 'Received value from promise');
if(yieldIn instanceof Error){
console.log(i++, 'Value was instance of Error');
try {
yieldedOut = runGeneratorFunc.throw(yieldIn)
}
catch(err){
console.log(i++, 'Throw Error');
throw(yieldIn);
}
} else {
yieldedOut = runGeneratorFunc.next(yieldIn);
}
} else {
try {
yieldIn = yieldedOut.value;
yieldedOut = runGeneratorFunc.next(yieldIn);
}
catch(err) {
runGeneratorFunc.throw(err);
reject(err);
}
}
}
resolve(yieldedOut.value);
}
return new Promise(function (resolve, reject) {
var runIterator = iterator(resolve, reject);
(function keepIterating(yieldIn) {
let yieldedOutPromise = runIterator.next(yieldIn);
if (!yieldedOutPromise.done) {
yieldedOutPromise.value.then(function (fulfilledValue) {
console.log('never gets here');
keepIterating(fulfilledValue);
});
yieldedOutPromise.value.catch(function (err) {
console.log(i++, 'Rejected promise catched');
if (err instanceof Error) {
try {
console.log(i++, 'Rejected promise is instance of Error');
let yieldedOut = runIterator.next(err);
keepIterating(yieldedOut);
}
catch (err) {
console.log(i++, 'Error propagated back out');
yieldedOutPromise.value.catch(() => {})
reject(err);
}
} else {
try {
let yieldedOut = runIterator.next(new Error(err));
keepIterating(yieldedOut);
}
catch (err) {
reject(err);
}
}
})
}
})();
});
}
}
现在,当我使用这段代码导入并运行它时:
const md = require('./module');
function* dummy () {
yield Promise.reject(new Error('error1'));
}
md.runGen(dummy)
.catch(err => {
console.log(9, 'Finished!');
})
我将此记录到控制台:
0 'Ready for next iteration'
1 'Ready for next iteration'
2 'Promise yielded out'
3 'Rejected promise handled'
4 'Rejected promise instance of Error'
5 'Ready to handle promise value'
6 'Value was instance of Error'
7 'Throw Error'
8 'Error propagated back out'
9 'Finished!'
(node:9904) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: error1
(node:9904) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
除了有关 UnhandledPromiseRejectionWarning
的警告外,这一切都符合预期。我很困惑为什么我会收到此警告,因为据我所知,在代码中处理了被拒绝的 Promise
。
我忽略了什么?
最佳答案
What am I overlooking?
您的 yieldedOutPromise.value.then
调用正在创建一个新的 promise ,如果 yieldedOutPromise.value
拒绝,那么它也将被拒绝。您通过 .catch
处理 yieldedOutPromise.value
上的错误并不重要,周围仍然存在被拒绝的 promise ,并且将报告该 promise 。
您基本上是在拆分您的 promise 链,这导致每一端都需要一个错误处理程序。但是,您根本不应该拆分任何东西。而不是
promise.then(onSuccess);
promise.catch(onError);
你应该使用的反模式
promise.then(onSuccess, onError).…
哦,当你在做的时候,avoid the Promise
constructor antipattern .就这样
module.exports = function runGen (generatorFunc, startValue) {
return Promise.resolve(startValue).then(generatorFunc).then(generator => {
return keepIterating({done: false, value: undefined});
function keepIterating({done, value}) {
if (done) return value;
return Promise.resolve(value).then(fulfilledValue =>
generator.next(fulfilledValue)
, err =>
generator.throw(err)
).then(keepIterating);
}
});
};
关于javascript - 即使处理了拒绝的 promise ,也收到 `UnhandledPromiseRejectionWarning`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963671/
我有 await 语句,它们可能会引发错误,因此我在 try/catch 内执行它们。但是 try/catch 没有捕获它们,我收到警告: (node:4496) UnhandledPromiseRe
最近,我在ionic中创建了一个应用程序,我想在ios中对其进行测试。所以我运行命令ionic cordova emulate ios。但是,这给了我以下错误。 (节点:4200)UnhandledP
我正在尝试使用 node.js discord 模块制作一个机器人,当在 discord 中输入命令时,它会向用户发送私有(private)消息。该命令应该像这样使用 !rp 然后邮件将发送给收件人
我正在尝试调用一个异步方法。异步方法是: async connect() { this.pool = await mysql.createPool(this.conf);
我按议程包编写了一些代码,但在运行我的项目时遇到了 UnhandledPromiseRejectionWarning。 我的代码在这里: agenda.define('transferDBField'
我有一个代码: function () { return new Promise((resolve, reject) => { try { fetch(URL, { metho
以下是我在 graphql(apollo-server)服务器中的 onDisconnect 函数代码(但不是特定于 graphql 的)。它包含一个 postgres 事务,通过 DB 适配器使用。
我是 Javascript Promise 的新手。我正在尝试以基于 Promises 的方式执行 MySQL 查询,我已经挠头半个小时了,但我仍然找不到这段代码中的问题。我正在使用this arti
尝试从 localhost:3000/todos/在 mongodb 中创建数据后获取数据,我在 Node 中收到错误 [UnhandledPromiseRejectionWarning: 错误 [E
我收到以下错误: Houston we got an err at getGames in index.js (node:72197) UnhandledPromiseRejectionWarning
所以我正在使用 Express.JS 和 MongoDB 制作一个 Web 应用程序,当我尝试在本地运行它时,它可以工作,但是当我用我的 aws Ubuntu 20.04 机器运行它时,它给了我以下错
我在调用其他发出 axios 请求的函数的函数中处理 UnhandledPromiseRejectionWarning 时遇到问题。 const getCode = async () => { c
我对 Node JS 还很陌生,所以我有点挣扎。 我正在尝试使用 Google Drive 的 API 从我的 Node Js 代码读取文件。 我有以下代码 router.get('/', funct
我正在使用 Angular/Firebase 在 Ionic 中构建一个应用程序。 我想在我的 Android 设备上测试该应用程序,该设备以前运行良好。但是,最近我无法运行它,因为出现错误。 $ i
这个问题在这里已经有了答案: How is PromiseRejectionEvent triggered? (2 个答案) 关闭 3 年前。 如果我在拒绝 promise 后清除计时器 - 无论我
我的目标是使用 Node.js 从网站上抓取一些数据. 我已经设法仅使用request 包来抓取数据,但是我要抓取的站点具有动态内容,而request 只能抓取此动态数据。 所以我做了一些研究,发现要
我玩过 Mocha 测试。我注意到我的函数在少数地方引发了 “UnhandledPromiseRejectionWarning” 警告。它使脚本无法通过检查。 我无法在互联网上找到有用的示例来教授/展
最近,我在测试代码时经常遇到此错误。刚才我在尝试执行包含错误的同步代码时再次收到此错误: (async function() { const characterProfile = await Mo
我知道涉及 SO 上的 UnhandledPromiseRejectionWarning 问题的现有答案,但找到的答案似乎都与我的情况不充分匹配。基本上,我以为我知道如何处理 promise 。但这个
我当前的nodejs版本是:8.9.1 我正在尝试执行我的代码,但总是遇到此错误,尝试修复它,但总是出现相同的错误: (node:38) UnhandledPromiseRejectionWarnin
我是一名优秀的程序员,十分优秀!