Javascript nodejs承诺了从settimeout实现的最佳方法
我在nodejs中使用了以下函数,但我使用的是setTimeout,而不是promise。如果createchange花费的时间超过了超时时间,则我的代码将失败,但无法正确捕获错误 我将如何替换或更改以下函数以使用承诺,以便deploychange在继续执行代码之前等待createchange完成 我试过几种方法,但似乎都不管用。不确定为了获得最有效的解决方案,我应该重做哪个函数 任何帮助都将不胜感激 第一功能Javascript nodejs承诺了从settimeout实现的最佳方法,javascript,node.js,promise,request-promise,Javascript,Node.js,Promise,Request Promise,我在nodejs中使用了以下函数,但我使用的是setTimeout,而不是promise。如果createchange花费的时间超过了超时时间,则我的代码将失败,但无法正确捕获错误 我将如何替换或更改以下函数以使用承诺,以便deploychange在继续执行代码之前等待createchange完成 我试过几种方法,但似乎都不管用。不确定为了获得最有效的解决方案,我应该重做哪个函数 任何帮助都将不胜感激 第一功能 function createchange(accessToken){
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 run() {
deploychange();
setTimeout(function(){ deployinsert(); }, 7500);
deployrun();
}
第三功能
function run() {
deploychange();
setTimeout(function(){ deployinsert(); }, 7500);
deployrun();
}
function deploychange (callback) {
if (req.body.deployEnv == "PRD"){
getToken(function(accessToken) {
createchange(accessToken);
})};
}
根据请求承诺文档,rp返回一个承诺 实际上,您可以将createChange函数转换为返回如下承诺:
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
}
});
};
然后可以使用wait关键字调用函数
await createchange(accessToken);
确保使用await的函数标记为async
你也可以这样写:
createchange(accessToken)
.then(({changeId}) => {
// Do someth with the changeId
})
.catch(/* Error handling */)
我将尝试一下Bastien使用async。我仍然可以使用data.body.changeId调用我的changeId吗?当然,createChange函数将返回经典回调函数的
res
部分。err
部分将被抛出/捕获。因此您基本上可以这样做:const res=await createchange(accessToken)
和访问res.body.changeid
@Spring\u重新启动,您需要更多信息来解决问题。总之,deploychange()
应该返回promisified,为了返回promisified,getToken()
必须是“promisified”。从createChange()
返回承诺只是解决方案的一部分。