Microsoft Dynamics CRM 365异步通过JavaScript调用操作

问题描述:

有没有一种方法可以在不使用第三方脚本的情况下通过javascript调用操作?Microsoft Dynamics CRM 365异步通过JavaScript调用操作

我发现这个https://github.com/PaulNieuwelaar/processjs

但是,我不能使用第三方库。

在此先感谢。

UPDATE:

下面是一个说明对通过JavaScript的动作的异步调用一些示例代码。需要记住的重要一点是将请求的打开方法的最后一个参数设置为true

req.open(consts.method.post,oDataEndPoint,true);

//插件

public class RunAsync : CodeActivity 
    { 
     [Input("input")] 
     public InArgument<string> Input { get; set; } 

     [Output("output")] 
     public OutArgument<string> Output { get; set; } 

     protected override void Execute(CodeActivityContext executionContext) 
     { 
      try 
      { 
       Thread.Sleep(20000); 
       Output.Set(executionContext, $"Result:{Input.Get(executionContext)}");     
      } 
      catch (Exception e) 
      { 
       throw new InvalidPluginExecutionException(e.Message); 
      } 
     } 
    } 

// JavaScript的

function callAction(actionName, actionParams, callback) { 

    var result = null; 
    var oDataEndPoint = encodeURI(window.Xrm.Page.context.getClientUrl() + consts.queryStandard + actionName); 

    var req = new XMLHttpRequest(); 
    req.open(consts.method.post, oDataEndPoint, true); 
    req.setRequestHeader(consts.odataHeader.accept, consts.odataHeader.applicationJson); 
    req.setRequestHeader(consts.odataHeader.contentType, consts.odataHeader.applicationJson + ";" + consts.odataHeader.charset_utf8); 
    req.setRequestHeader(consts.odataHeader.odataMaxVersion, consts.odataHeader.version); 
    req.setRequestHeader(consts.odataHeader.odataVersion, consts.odataHeader.version); 
    req.onreadystatechange = function() { 
     if (req.readyState === 4) { 
      req.onreadystatechange = null; 
      if (req.status === 200) { 
       if (callback) { 
        result = JSON.parse(this.response); 
        callback(result); 
       } 
      } else { 
       console.log(JSON.parse(this.response).error); 
      } 
     } 
    }; 
    req.send(JSON.stringify(actionParams)); 
} 

function onLoad() { 

    console.log('call action...'); 

    var actionParams = { 
     Input: 'test1234'        
    }; 

    callAction('TestAsyncAction',actionParams, function(data){    
     console.log('action callback triggered...'); 
     console.log(JSON.stringify(data)); 
    }); 

    console.log('action called...');  
} 

//行动

enter image description here

您可以使用webapi to execute custom Action。这是包装在XMLHttpRequest &可以被称为异步。

/api/data/v8.2/Action_Name 

对于异步运行:

req.open(....., true); 

同样使用soap call(不推荐)。

Processjs使用Organization.svc/web这将被弃用。

+0

我已经注意到它实际上是在同步执行,并用一个等待20秒的伪插件验证了这一点,并在调用动作之前和之后以及动作的回调中打印了控制台消息。将上传代码。这里是一篇文章,也打电话是同步 - http://blogs.microsoft.co.il/rdt/2016/01/13/executing-custom-action-via-javascript/ 仍然检查其他信息在线。有任何想法吗? – noobie

+0

req.open(.....,false)是同步的。试试异步 –

+1

辉煌!有效。谢谢你的帮助。我会用其他人的代码更新我的问题。 – noobie