我开始在NodeJS中使用promise。要求是因为异步调用而使用这些。这是我为承诺写的第一个代码。
function asyncFunc(data) {
return new Promise(
function(resolve, reject) {
try {
resolve(data);
} catch (err) {
reject("Custom Error");
}
});
}
//Usage:
asyncFunc('Sample String')
.then(result => { console.log(result); })
.catch(error => { console.log(error); });
//Output:
Sample String
null
//If I change the code to:
function asyncFunc(data) {
return new Promise(
function(resolve, reject) {
try {
reject("Custom Error");
} catch (err) {
resolve("Data");
}
});
}
//Output:
//Exception has occurred: string
//I get the above exception at line: reject("Custom Error");
所以问题是"拒绝"只能用于" catch"块?为什么我不能提出"拒绝"手动事件?什么是场景"拒绝"用来?有人可以给我一个更好的例子,我可以同时使用"解决"并且"拒绝"?
答案 0 :(得分:0)
当然,如果你愿意,你可以使用拒绝。 假设你有一个功能可以解决一个人是成年人的承诺,如果不是,就会拒绝承诺。
你有这样的事情:
function asyncFunc(age) {
return new Promise((resolve, reject) => {
if(age >= 18) {
resolve(true);
} else {
// here you call reject manually outside of a catch block
reject(false);
// or
// reject(Error('not adult'));
}
});
}
用法:
asyncFunc(19).then(result => {
console.log(result); // true
})
.catch(error => {
console.log(error); // false or Error('not adult')
});
答案 1 :(得分:0)
可能你有类似的东西(节点:5009)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
看起来您在控制台中运行asyncFunc(..)
。在这种情况下,node.js会在您点击Enter
后首先执行您的函数。尝试将代码转换为大括号,如下所示:
{
asyncFunc('Sample String')
.then(result => { console.log(result); })
.catch(error => { console.log(error); });
}
答案 2 :(得分:0)
如果遇到try/catch
阻止,您通常会reject
catch
,reject
try
。resolve
reject
和resolve
基本上是对Promise的回调。如果你reject
它会进入下一个链,如果你function
它将打破链。
因此,在发生错误时应使用拒绝原因拒绝将破坏承诺链。
例如。
假设您有一个function
可以使用回调,并且您希望将其包含在Promise之类的函数中。此true
将检查用户是否存在于数据库中。如果找到用户,如果不是false
,它将返回function checkUserExist(id) {
return new Promise((resolve, reject) => {
checkUserExistInDatabase(id, function(result, error) {
if (error) {
reject(error);
}
if (result != null) {
resolve(true);
} else {
resolve(false);
}
})
});
}
function databaseError() {
return new Promise((resolve, reject) => {
reject();
})
}
var idsThatExist = [];
checkUserExist(1).then(function(exist) {
if (exist)
idsThatExist.push(1);
return checkUserExist(2)
}).then(function(exist) {
if (exist)
idsThatExist.push(2);
return databaseError(3)
}).then(function(exist) {
//WILL never Reach here
if (exist)
idsThatExist.push(3);
return checkUserExist(4)
}).then(function(exist) {
if (exist)
idsThatExist.push(4);
}).catch(function(err) {
//it will skip checkUserExist(4)
console.log('I got rejected after checked users:'
idsThatExist)
})
,如果数据库中存在错误(例如连接),它将拒绝。
http://localhost:8000/user/1
return :Name: 1
http://localhost:8000/ID/1
return :ID: 1
答案 3 :(得分:0)
所以问题是“拒绝”只能用于“捕获”块?
不,你可以在任何地方使用reject
。使用Catch
reject
为什么我不能手动提出“拒绝”事件?
您可以使用[{1}}创建new Promise()
或static
方法拒绝。请参阅Promise
和promiseUsingNew()
使用什么情景“拒绝”?
promiseUsingStaticMethod()
用于同步编程中的错误处理。 try/catch
& resolve
用于异步编程操作中的错误处理,而不是回调。
有人能为我提供一个更好的例子,我可以同时使用“解决”和“拒绝”吗?
reject