如何解决如何在XMLHttpRequest之后返回Promise
我在Dynamics 365中调用功能enableButton来启用/禁用按钮。我必须向系统返回一个Promise。如果我执行一个简单的返回Promise的测试功能,则可以正常工作,但是我需要获取一个令牌,然后对服务进行外部调用以设置true / false,然后返回Promise。当我这样做时,它不起作用。似乎Dynamics永远不会从函数中获得Promise。
这是我的代码(我提供了一些细节)。我只在Dynamics中调用enableButton()。
function enableButton() {
var params = getParams();
var xhr = new XMLHttpRequest();
xhr.open("POST","http://my.tokenendpoint.com");
xhr.onload = function () {
var token = JSON.parse(xhr.response).access_token;
getExternalData(token,ssn);
}
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(params);
}
function getExternalData(token) {
return new Promise(function (resolve,reject) {
var url = "http://example.com"
var query = JSON.stringify(
{
"queryparams": true
}
);
var xhr = new XMLHttpRequest();
xhr.open("POST",url);
xhr.onload = () => {
if (xhr.readyState === xhr.DONE) {
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
var hasExternalData = hasExtData(data[0]); //returns a boolean
resolve(hasExternalData);
}
else {
reject(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
reject(xhr.statusText);
};
xhr.setRequestHeader("Authorization","Bearer " + token);
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(query);
});
}
我已经使用fetch重写了代码,但是我没有收到正确的数据以返回Dynamics。
如果我在Dynamics中使用像这样的简单函数进行测试,它将起作用:
function enableButton() {
return new Promise(function (resolve,reject) {
var test = true;
resolve(test);
},function (error) {
reject(error.message);
console.log(error.message);
}
);
}
如果我这样做,将无法正常工作:
function enableButton() {
fetch(accesstokenUrl,{
method: 'POST',body: <omitted params>
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
.then(function (response) {
return response.json();
})
.then(function (resJson) {
return fetch(url,{
method: 'POST',headers: {
'Authorization': 'Bearer ' + resJson.access_token,'Content-Type': 'application/json'
},body: JSON.stringify(
{
"queryparams": true
})
});
})
.then(function (res) {
return res.json();
})
.then(function (data) {
const hasDebtCase = getDebtCase(data);
if (hasDebtCase) {
return Promise.resolve(hasDebtCase);
} else {
return Promise.reject(data);
}
})
.catch((error) => {
console.error('Error:',error);
})
};
我这是什么问题?
解决方法
请参阅以下有关在Dynamics CRM中使用启用规则时如何返回承诺的文章。 https://ajitpatra.com/2019/12/11/d365-enable-rule-for-button-with-asynchronous-api-request-using-promise/?utm_campaign=Dynamics%20Weekly&utm_medium=email&utm_source=Revue%20newsletter
如果我有帮助,请标记我的回答
,对于您而言,最好对fetch使用async / await。
async function enableButton() {
const responseA = await fetch(accesstokenUrl,{
method: 'POST',body: {
"access_token": "123"
},});
const responseAJson = await responseA.json();
console.log("Response from the first fetch",responseAJson);
console.log("Your Access Token",responseAJson.access_token);
const responseB = await fetch(url,headers: {
'Authorization': 'Bearer ' + responseAJson.access_token,'Content-Type': 'application/json'
},body: JSON.stringify(
{
"queryparams": true
})
});
console.log("Response from the second fetch",await responseB.json());
const hasDebtCase = getDebtCase(responseB.json());
if (hasDebtCase) {
return Promise.resolve(hasDebtCase);
} else {
return Promise.reject(data);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。