异步承诺中未处理的承诺拒绝
Unhandled promise rejection in asynchronous promises
我正在使用obe .js解析一个非常非常大的JSON文件
const promises = [];
oboe('http://domain/my-file.js')
.node('items.*', item => {
// parseItem() returns a rejected Promise because of invalid JSON items
promises.push(parseItem(item));
})
.done(() => {
Promise.all(promises).then(() => {
doSomething();
});
})
但是我的浏览器控制台充斥着Uncaught (in promise)
。如果您在setTimeout()
(如
const promises = [];
setTimeout(() => {
promises.push(Promise.reject());
}, 500);
// some time in the future
Promise.all(promises);
真正奇怪的是:现代浏览器的行为不同。在火狐开发者版一切工作没有错误信息,在Chrome我被淹没了Uncaught (in promise)
。在Chrome中,如果你写Promise.reject();
没有捕获,你会立即得到消息。在Firefox和Safari中什么也不会发生。
那么这个问题的解决方案是什么呢?忽略信息?我的意思是,如果这种行为真的在官方承诺规范中,那么异步代码中的承诺对我来说就没有意义了。
您的Oboe问题是基于Oboe流JSON的事实,所以我们永远不会提前知道有多少承诺,所以我们不能提前将责任附加到Promise.all
上。我们可以"承诺"Oboe能够在它的方法中返回承诺。
通常,我会使用RxJS从事件发射器自动创建流- RxJS的方法已经可以返回承诺,然后聚合它。然而,因为我不想要一个第三方库,而且它没有什么教学价值——让我们自己实现它:
function addMap(oboe) {
oboe.map = function(selector, mapper){
var promises = [];
return new Promise(function(resolve, reject){ // create a new promise
oboe.node(selector, function(match){
var result = mapper(match); // get result
// signal that we're handling the rejection to make sure it's not handled.
result.catch(function(){});
promises.push(result);
});
oboe.fail(reject);
oboe.done(function(){ resolve(promises); });
});
};
}
我们可以这样做:
var o = oboe("foo");
addMap(o);
o.map("items.*", item => downloadItem(item)).then(result => {
// handle result here
});
你的setTimeout
问题很做作。在实践中,绝大多数人不会编写像这样的代码——在实践中,当不使用强制您这样做的API时,异步添加错误处理程序是非常罕见的用例(如obe .js示例)。
真正奇怪的是:现代浏览器的行为不同
这是因为Firefox使用GC来检测未处理的拒绝,而Chrome使用计时器。这是实现的细节——唯一的保证是,如果在微任务中附加错误(同步的,或者在同一回合执行的then
中),则不会记录错误。
相关文章:
- 我怎样才能让承诺拒绝测试
- Angularjs 承诺拒绝链接
- 承诺拒绝错误 - 未处理的拒绝错误:已关闭
- 连锁Angular承诺拒绝
- 知道操作是成功还是被承诺拒绝
- 异步承诺中未处理的承诺拒绝
- 可能的未处理承诺拒绝(id:0): undefined不是一个对象
- 什么是未经处理的承诺拒绝
- 未处理的承诺拒绝:不能调用方法'push'零
- Angular 2 - zone.js:355未处理承诺拒绝:模板解析错误:'不是已知元素:
- 使用CommonJS承诺:拒绝与异常
- 理解node.js中的承诺拒绝
- 为什么这是未处理的承诺拒绝
- 未处理的承诺拒绝:ReferenceError: _body没有定义
- 可能未处理的承诺拒绝- React-Native与Firebase
- 未处理的承诺拒绝:模板解析错误
- React Native错误:可能未处理的承诺拒绝-无法读取属性数据
- 未处理的承诺拒绝:推.On不是一个函数
- 回报的承诺.拒绝离子页
- 捕获所有未处理的javascript承诺拒绝