简介
我有3个Node函数,第一个检索从前端发送的数据,第二个获取有效的API密钥,第三个函数使用前两个函数的数据发布到API。
我想在第一个函数上有一个case语句,我可以在每个case上使用res.send('')
。每个案例都表明函数失败或通过。
我需要什么
第二个和第三个函数函数中的一种方法是根据函数的结果触发一个案例。
也许if else,如果第一个函数失败,如果第二个失败,如果第三个失败,但如何从第一个函数执行此操作?
例如
switch(expression) {
case 1:
res.send('function 1 pass')
break;
case 2:
res.send('function 1 fail')
break;
case 3:
res.send('function 2 pass')
break;
case 4:
res.send('function 2 fail')
break;
case 5:
res.send('function 3 pass')
break;
case 6:
res.send('function 3 fail')
break;
default:
res.send('something went wrong')
}
我的代码
var firstFunction = function () {
return new Promise(function (resolve) {
setTimeout(function () {
app.post('/back-end/controller', function (req, res) {
console.log(req.body);
var login = req.body.LoginEmail;
if (login.length !== 0) { // maybe use node email validation ?
console.log("First done");
res.send(200,'Success',{ user: login });
resolve({
data_login_email: login
});
} else {
console.log("Failed");
res.send(404,'Failed user not registered',{ user: login });
}
});
}, 2000);
});
};
var secondFunction = function () {
return new Promise(function (resolve) {
setTimeout(function () {
nodePardot.PardotAPI({
userKey: userkey,
email: emailAdmin,
password: password,
DEBUG: false
}, function (err, client) {
if (err) {
// Authentication failed
console.error("Authentication Failed", err);
} else {
// Authentication successful
var api_key = client.apiKey;
console.log("Authentication successful", api_key);
resolve({data_api: api_key});
}
});
}, 2000);
});
};
function thirdFunction(result) {
return new Promise(function () {
setTimeout(function () {
var headers = {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded'
};
var api = result[1].data_api;
var login_email = result[0].data_login_email;
var options = {
url: 'https://pi.pardot.com/api/prospect/version/4/do/read',
method: 'POST',
headers: headers,
form: {
'email': login_email,
'user_key': userkey,
'api_key': api
},
json: true // Automatically stringifies the body to JSON
};
// Start the request
rp(options)
.then(function (parsedBody) {
console.info(login_email, "Is a user, login pass!");
console.error("Third done");
})
.catch(function (err) {
console.error("fail no such user");
// res.status(400).send()
});
}, 3000);
}
);
}
Promise.all([firstFunction(),secondFunction()]).then(thirdFunction);
答案 0 :(得分:0)
Promises使用switch
内置了一些逻辑功能,而不是then/catch
语句。如果我理解这个问题,你可以这样做:
firstPromise = firstFunction()
.then(args => {
res.send('function 1 pass');
return args;
})
.catch(err => {
res.send('function 1 fail');
throw err;
});
secondPromise = secondFunction()
.then(args => {
res.send('function 2 pass');
return args;
})
.catch(err => {
res.send('function 2 fail');
throw err;
});
thirdPromise = Promise
.all([firstPromise, secondPromise])
.then(thirdFunction)
.then(args => {
res.send('function 3 pass');
return args;
})
.catch(err => {
if (/* `err` from thirdFunction, not firstFunction or secondFunction */)
res.send('function 3 fail');
throw err;
});
然后你只需要找出检查错误来源的逻辑。如果fromThird
失败,一个选项是在thirdFunction
(或任何名称)属性上添加错误,因此您的条件为if (err.fromThird) res.send('function 3 fail');