【问题标题】:Unable to Pass Two Parameters as Argument to Javascript Function无法将两个参数作为参数传递给 Javascript 函数
【发布时间】:2020-05-07 07:00:53
【问题描述】:

我正在尝试使用 karate.call 来调用接收两个参数(字符串、字符串数组)的 JS 文件的函数。但是字符串数组不会传递给 JS 文件。

JS文件包含:

function(query, fragments) {
// Here lies some code
// One of them includes fragments.length;
}

而我是这样调用另一个JS文件上的JS函数的:

//var query = 'Some string';
//var fragments = ['fragment1', 'fragment2'];
var clean = karate.call('../helper/helper.js', [query, fragments]);

我可以传递字符串形式的查询。但我无法传递字符串数组。错误说:

TypeError: Cannot read property "length" from undefined

似乎字符串数组没有传递给 JS 函数。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您的.call() 只传递一个参数,即您从queryfragments 构建的数组。如果您使用.apply() 而不是.call(),那将是有意义的。

标签: karate


【解决方案1】:

你可以先读你的函数,然后调用就像任何其他 js 函数一样

var myFun = karate.read('../helper/helper.js');
var funCall = myFun(query, fragments);

 var myCall = karate.read('../helper/helper.js')(query, fragments);

这应该可以。

【讨论】:

    【解决方案2】:

    .call将参数作为逗号分隔的值,如果你想将值作为数组传递,则需要使用.apply

    var clean = karate.call('../helper/helper.js', query, fragments);
    

    会起作用的...

    【讨论】:

    • 这不起作用,因为空手道抱怨 javascript 函数调用失败:TypeError: Can not invoke method [jdk.internal.dynalink.beans.OverloadedDynamicMethod Object com.intuit.karate.core.ScriptBridge.call(String,Object) Object com.intuit.karate.core.ScriptBridge.call(String) ] with the passed arguments; they do not match any of its method signatures.
    【解决方案3】:

    这里的答案缺少一个重要的说明:

    我经常做单参数函数,比如:

    * def concatParams =
      """
      function(s) {
        return "urldt=" + todaysDate + "&caseid=" + s.caseid
      } 
      """
    

    我会这样称呼它:

    * def params = call concatParams {caseid: '3433344'}
    

    但是,当我想做 2 个参数时,我会像这样定义一个函数:

    * def concatParams =
      """
      function(d,s) {
        return "urldt=" + d.date + "&caseid=" + s.caseid
      } 
      """
    

    而且不直观的是,这些都不起作用:

    * def params = call concatParams {date: '01/01/2020', caseid: '3433344'}
    * def params = call concatParams '01/01/2020' '3433344'
    

    为了让它工作,我这样称呼它:

    * def params = concatParams('01/01/2020', '3433344')
    

    文档没有说明这一点。

    【讨论】:

    • 你错了。文档确实澄清了这一点:github.com/intuit/karate#javascript-functions
    • 嗯。你的情况与我在这里问的不同。就像彼得说的那样,当在功能中声明时,我可以像常规 JS 函数一样传递参数
    【解决方案4】:
     var clean = karate.call('../helper/helper.js', query, fragments);
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

    【讨论】:

    • 这不起作用,因为空手道抱怨 javascript 函数调用失败:TypeError: Can not invoke method [jdk.internal.dynalink.beans.OverloadedDynamicMethod Object com.intuit.karate.core.ScriptBridge.call(String,Object) Object com.intuit.karate.core.ScriptBridge.call(String) ] with the passed arguments; they do not match any of its method signatures.
    【解决方案5】:

    call 方法接受逗号分隔的参数和apply 接受数组,因此您需要将call 替换为apply。你的代码看起来像

    function karate(query, fragments) {
    // Here lies some code
    // One of them includes fragments.length;
    }
    
    var clean = karate.apply('../helper/helper.js', [query, fragments]);
    

    【讨论】:

    • 我认为没有 karate.apply() 的方法,因为它在文档中也没有。我试过你的推荐,上面写着karate.apply is not a functiongithub.com/intuit/karate
    • @Raymond 请给函数起个名字,代码已更新。
    • 大家:请忽略这个答案,一旦你定义了一个JS函数,你就可以像NORMAL JS一样给它加上括号和参数。更糟糕的是,这个例子重新定义了内置的karate JS helper 对象
    猜你喜欢
    • 2019-08-29
    • 2013-01-27
    • 1970-01-01
    • 2015-06-09
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多