我正在使用promises并且代码如下所示:
function getStuff() {
return fetchStuff().then(stuff =>
process(stuff)
).catch(err => {
console.error(err);
});
}
Run Code Online (Sandbox Code Playgroud)
要么:
async function getStuff() {
try {
const stuff = await fetchStuff();
return process(stuff);
} catch (err) {
console.error(err);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免错过错误但是同事用户告诉我不应该这样做而且不赞成.
return ….catch(err => console.error(err))
?我目前正在尝试实现我自己的Promise在Angular 2中使用.如果我reject
承诺,我会得到一个Error: Uncaught (in promise): nope(…)
,但只有第一个Promise被拒绝.
它是Angular 2.0.0-rc.4
,但我在其他行为中注意到了这一点.我的问题是,这是我对Promises的理解中的错误,还是应该向Angular项目报告的错误?
示例代码:
import {Component} from '@angular/core';
import {bootstrap} from '@angular/platform-browser-dynamic'
@Component({
template: "TestComponent"
})
class TestComponent {
}
bootstrap(TestComponent, []);
let p = new Promise((resolve, reject) => {
console.log("create promise");
reject("nope");
});
console.log("setting up");
p.then(r => console.log("then: " + r));
p.catch(e => console.log("reject: " + e));
console.log("setup done");
Run Code Online (Sandbox Code Playgroud)
控制台(谷歌浏览器51.0.2704.106,Linux 64位):
create promise
setting up
setup done
reject: nope
Angular 2 is running in the development mode. Call …
Run Code Online (Sandbox Code Playgroud) 有人能解释一下,为什么当我尝试使用返回错误的突变时,为什么我的反应应用程序 + 阿波罗的行为是这样的?
GraphQL 突变返回这个(响应代码是 200): {"errors":[{"error":{"result":"identity.not-found","error":"authentication-failed","statusCode":401}}],"data":{"login":null}}
我的突变看起来像这样:
export const LOGIN_MUTATION = gql`
mutation($input: LoginInput!) {
login(input: $input) {
token
}
}
`;
Run Code Online (Sandbox Code Playgroud)
称为:
const handleSignIn = () => {
loginMutation({
variables: {
input: {
clientId: config.clientId,
username: userName,
password: password,
clientSecret: config.clientSecret
}
}
});
};
Run Code Online (Sandbox Code Playgroud)
它会像预期的那样运行一段时间(呈现我自己的自定义错误组件 - {error && <div>error</div>}
),但随后它抛出了这种未经处理的拒绝。
如果我将 catch 回调添加到突变调用,它会按预期工作。
但是,我没有在 apollo 文档中找到任何关于始终以这种方式捕获 GraphQL 错误的必要性的提及。如果我理解正确,这应该足够了:const[loginMutation, {data, loading, error}] = useMutation(LOGIN_MUTATION);
这种行为是正确的还是我错过了什么?
版本:
"@apollo/react-hooks": "^3.1.3"
"apollo-boost": "^0.4.7"
"graphql": "^14.5.8"
Run Code Online (Sandbox Code Playgroud) 我正在使用Node 7.2.1和新的async/await功能.我也使用像这样的猫鼬本机ES6 Promises -
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
Run Code Online (Sandbox Code Playgroud)
我的代码流是这样的 -
async function getFollowers(){
try {
const followers = await User.getFollowersFromMongo(req.params.userId);
res.send(followers);
} catch (err) {
winston.error('Printing Error = ', err);
res.status(400).send({success: false, error: err});
}
}
UserSchema.statics.getFollowersFromMongo = async(userId) => {
try {
let aggregateQuery = []; //some syntactical error in mongo query to produce exception
const followers = await User.aggregate(aggregateQuery);
return followers.map(follower => follower.followerData);
}
catch (err) {
return Promise.reject(err);
}
};
Run Code Online (Sandbox Code Playgroud)
这段代码非常好用.出现错误时会出现问题.所以我故意修改我的mongoose …
我最近一直在阅读有关 async/await 并使用 try 和 catch 来处理承诺拒绝的内容,并将其应用于我的一些旧代码。
我有以下几点:
async function() {
try {
await Promise.all([some functions]);
doIfNoError();
} catch (error) {
console.log(error);
}
Run Code Online (Sandbox Code Playgroud)
我传递给 Promise.all 的函数遵循以下形式:
async function() {
some code
if (some condition) {
return true
} else {
throw false
}
}
Run Code Online (Sandbox Code Playgroud)
我打算如果任何传递给 Promise.all 的函数被拒绝,就会显示拒绝。如果没有一个函数拒绝,那么 doIfNoError 应该触发。但是,doIfNoError 有时会在不应该触发时触发,并且我会收到错误“未处理的承诺拒绝”。
我在 nodejs 中运行服务器,在执行服务器代码时,我收到错误消息“(节点:7692)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 ID:2):错误:请求失败,状态代码为 400(节点:7692)弃用警告:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程”。
这是我的 serverrender.js 代码
import axios from 'axios';
import config from './config';
axios.get('${config.serverUrl/api/contests')
.then(resp=>{
console.log(resp.data);
});
Run Code Online (Sandbox Code Playgroud)
这是我的 srver.js 代码
import config from './config';
import apiRouter from './api';
import express from 'express';
import path from 'path';
import sassMiddleware from 'node-sass-middleware';
import './serverRender';
const server=express();
server.set('view engine','ejs');
server.use(sassMiddleware({
src:path.join(__dirname,'sass'),
dest:path.join(__dirname,'public')
}));
server.get('/',(req,res)=>{
res.render('index',{
content:"... "
});
});
server.use(express.static('public'));
server.use('/api',apiRouter);
server.listen(config.port, config.host, () =>{
console.info('express listening on port ',config.port);
});
Run Code Online (Sandbox Code Playgroud) 我正在使用 React Native。我已经查看过什么是未处理的承诺拒绝?,但我完全看不懂。
当我创建一个组件时:
render(){
const MenuComponent = (
<MenuScreen CloseSlideMenu={this.SlideMenu.CloseSlideMenu} />
)
...
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'可能未处理的承诺拒绝(ID:0)类型错误:未定义不是函数(评估'_this.OpenSlideMenu.bind(true)。then(function(){}))'
this.OpenSlideMenu()
在constructor()
.
constructor (props, context) {
super(props, context)
this.OpenSlideMenu = this.OpenSlideMenu.bind(true).catch(function(e){
console.log("Promise Rejected");
});
this.CloseSlideMenu = this.CloseSlideMenu.bind(true).catch(function(e){
console.log("Promise Rejected");
});
}
Run Code Online (Sandbox Code Playgroud)
this.drawer 在 render() 方法中声明:
render () {
const MenuComponent = (
<MenuScreen CloseSlideMenu={this.SlideMenu.CloseSlideMenu} />
)
return (
<Drawer
ref={(ref) => this.drawer = ref}
content={MenuComponent}
tapToClose={true}
openDrawerOffset={170}
stles={drawerStyles}
panCloseMask={0.2}
closedDrawerOffset={-3}
styles={drawerStyles}
tweenHandler={(ratio) => ({
main: { opacity: (2-ratio)/2 } …
Run Code Online (Sandbox Code Playgroud) 我想测试查询不存在的表的异步功能。因此,该错误是有意产生的。
async function getPosts() {
try {
const connection = await dbConnection()
const result = await connection.query('SELECT * FROM x')
await connection.release()
console.log(result)
}
catch(ex) {
throw new Error(ex)
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用该函数时:
UnhandledPromiseRejectionWarning:错误:错误:ER_NO_SUCH_TABLE:表'test.x'不存在。
你能告诉我为什么吗?
javascript ×5
node.js ×5
es6-promise ×3
async-await ×2
promise ×2
reactjs ×2
angular ×1
apollo ×1
asynchronous ×1
graphql ×1
mongoose ×1
mysql ×1
react-native ×1
try-catch ×1