NodeJS:理解承诺

时间:2018-03-19 08:43:01

标签: node.js es6-promise

我开始在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"块?为什么我不能提出"拒绝"手动事件?什么是场景"拒绝"用来?有人可以给我一个更好的例子,我可以同时使用"解决"并且"拒绝"?

4 个答案:

答案 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 catchreject tryresolve

rejectresolve基本上是对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方法拒绝。请参阅PromisepromiseUsingNew()

  

使用什么情景“拒绝”?

promiseUsingStaticMethod()用于同步编程中的错误处理。 try/catch& resolve用于异步编程操作中的错误处理,而不是回调。

  

有人能为我提供一个更好的例子,我可以同时使用“解决”和“拒绝”吗?

reject