javascript - 在继续之前等待一个功能完成的最佳方法是什么?
问题描述
当我尝试使用 XrmServiceToolkit.Soap.Create 函数创建从 JS 到 CRM 的新记录时,它需要很长时间才能完成。所以 JS 继续执行另一个函数,在函数 RecalculateSurface 中我检索了由第一个函数创建的记录,因此我无法获取记录的值,因为它尚未保存。
function save()
{
//some code
delivery.attributes["eoz_unit"] = Unit;
delivery.attributes["description"] = quoteDetail.Description;
delivery.attributes["quoteid"] = { id: quoteId, logicalName: "quote", type: "EntityReference" };
XrmServiceToolkit.Soap.Create(delivery); //function 1
RecalculateSurface();
}
function RecalculateSurface()
{
// code to retreive the record created in function 1
}
任何想法让函数 RecalculateSurface() 等待记录的保存?XrmServiceToolkit.Soap.Create 函数返回所创建记录的 ID。
解决方案
所以,创建函数有一个可选的回调函数参数......
XrmServiceToolkit.Soap.Create(businessEntity, [callback(result)]);
您应该使用该选项,而不仅仅是传入实体
function save() {
//some code
delivery.attributes["eoz_unit"] = Unit;
delivery.attributes["description"] = quoteDetail.Description;
var quoteidObj = {
id: quoteId,
logicalName: "quote",
type: "EntityReference"
};
delivery.attributes["quoteid"] = quoteidObj;
// do function 1
XrmServiceToolkit.Soap.Create(delivery, function(result){
RecalculateSurface();
});
}
function RecalculateSurface() {
// code to retrieve the record created in function 1
}
这应该会导致 XrmServiceToolkit.Soap.Create 调用异步操作,并且仅在完成时调用 RecalculateSurface()。
如果您想扩展解决方案以使用 Promise,那么您可以执行以下操作:
function save() {
//some code
delivery.attributes["eoz_unit"] = Unit;
delivery.attributes["description"] = quoteDetail.Description;
var quoteidObj = {
id: quoteId,
logicalName: "quote",
type: "EntityReference"
};
delivery.attributes["quoteid"] = quoteidObj;
callCreate(delivery).then(function(){
RecalculateSurface()
});
}
function callCreate(delivery){
return new Promise(function(resolve,reject) {
XrmServiceToolkit.Soap.Create(delivery, function(result){
resolve();
});
});
}
function RecalculateSurface() {
// code to retrieve the record created in function 1
}
推荐阅读
- azure - 能否将 Azure 逻辑应用变量输出到文件并存储在 Blob 存储中?
- vue.js - mdb 数据表在 Vue.js 中不呈现数据
- jenkins - 使用 Jenkins 管道仅执行选定的作业
- javascript - Chart.js 只是最后一点
- php - 如何重定向子文件夹中的所有请求
- python - 如何在 Singularity 配方中激活 Anaconda 环境
- android - 使用 androidx NotificationManagerCompat 无法解析符号“来自”
- autohotkey - 在自动热键中的目录表达式中是非法的
- angular - Angular 材质动态单选按钮可以选择多个,但应该只允许在一个组中使用一次
- ruby - 是否可以与用 ruby.h 构建的 dll 共享 ruby 对象?