我在nodejs中有以下功能,但是我使用的是setTimeout而不是promise。如果createchange花费的时间超过我的超时时间,则我的代码将失败,但无法正确捕获错误。
在继续执行代码之前,我将如何替换或更改以下功能以与Promise一起使用,以便deploychange等待createchange完成。
我尝试了几件事,但似乎没有任何效果。不知道我应该重做哪种功能以获得最有效的解决方案。
任何帮助将不胜感激。
第一个功能
function createchange(accessToken){
const data = {
templateName: "Template 1",
summary: "Deploy Change",
configurationItems: [
config_item
],
wasEnvUsedForTesting: false,
environment: test_env
};
rp({
url: dbConfig.cmas_url,
resolveWithFullResponse: true,
method: 'POST',
json: true,
auth: {
bearer: accessToken
},
body: data,
headers: {
'Content-Type': 'application/json',
'apikey': dbConfig.consumer_key,
},
}, function(err, res) {
if(err){
console.log(err.body);
}else{
console.log(res.body);
crq = res.body.changeid;
}
});
}
第二个功能
function run() {
deploychange();
setTimeout(function(){ deployinsert(); }, 7500);
deployrun();
}
第三个功能
function deploychange (callback) {
if (req.body.deployEnv == "PRD"){
getToken(function(accessToken) {
createchange(accessToken);
})};
}
答案 0 :(得分:0)
根据请求承诺文档,rp返回一个promise。
您实际上可以将createChange函数转换为返回promise,如下所示:
const createchange = accessToken => {
const data = {
templateName: 'Template 1',
summary: 'Deploy Change',
configurationItems: [config_item],
wasEnvUsedForTesting: false,
environment: test_env
};
return rp({
url: dbConfig.cmas_url,
resolveWithFullResponse: true,
method: 'POST',
json: true,
auth: {
bearer: accessToken
},
body: data,
headers: {
'Content-Type': 'application/json',
apikey: dbConfig.consumer_key
}
});
};
然后可以使用await关键字调用函数。
await createchange(accessToken);
确保使用await的函数已标记为异步
您也可以这样写:
createchange(accessToken)
.then(({changeId}) => {
// Do someth with the changeId
})
.catch(/* Error handling */)