两个函数的Javascript回调

问题描述 投票:0回答:3

有没有办法用Javascript(ES6)实现下面的代码?

如果可以,我该怎么做?我尝试了这个例子,但没有成功。

const funcA = (callback, arg1) => {
  console.log("Print arg1: " + arg1); /* Print arg1: argument1 */
  let x = 0;
  x = callback(x, );
  return x;
}

const funcB = (x, prefix) => {
  console.log("Print prefix: " + prefix); /* Print prefix: PREFIX_ */
  x = x + 1;
  return x;
}

/* Exec function funcA */
let x = funcA(funcB( ,"PREFIX_"), "argument1");
console.log("Value of x: " + x); /* Value of x: 1 */
javascript ecmascript-6 callback
3个回答
2
投票

这是一种使用定义的占位符作为符号来标识尚未设置的参数的方法。

它具有一个

this
对象,该对象绑定到调用函数以进行进一步检查和评估。

如果

arguments
对象
this.arg
的组合数组不再有
placeholder
项,则使用参数调用该函数并返回函数调用。

如果没有,新的参数数组将绑定到函数并返回。

[?]
表示占位符

功能B x 前缀 这个.args 参数 行动
1.打电话 [?]
"PREFIX_"
[?],
"PREFIX_"
返回调用带有绑定参数的 fn
2.打电话
0
[?] [?],
"PREFIX_"
0
"PREFIX_"
使用参数返回 fn 调用
3.打电话
0
"PREFIX_"
返回
1

(当然它可以更短一些并委托给另一个函数,但这是一个概念证明。)

function funcA(callback, arg1) {
    console.log('funcA', callback, arg1)
    return callback(0, placeholder);
}

function funcB(x, prefix) {
    var args = this && this.args || [],
        temp = Array.from(arguments);

    console.log('funcB', isPlaceholder(x) ? '[?]' : x, isPlaceholder(prefix) ? '[?]' : prefix);

    // placeholder part
    if (temp.some(isPlaceholder)) {
        temp.forEach((a, i) => isPlaceholder(a) && i in args || (args[i] = a));
        return args.some(isPlaceholder)
            ? funcB.bind({ args })
            : funcB(...args);
    }

    // origin function body
    return x + 1;
}

const
    placeholder = Symbol('placeholder'),
    isPlaceholder = v => v === placeholder;

console.log("Value of x: " + funcA(funcB(placeholder, "PREFIX_"), "argument1"));


1
投票

js中还无法实现偏应用。您需要另一个充当回调的箭头函数:

funcA(x => funcB(x ,"PREFIX_"), "argument1");

称您不需要额外的逗号:

x = callback(x)

有时这个提案可能允许这样写:

 funcA( funcB(?, "PREFIX_"), "argument1")

-1
投票

一种方法是定义一个默认参数,该参数是传递给

funcA
的第一个参数的函数,并在调用
var
时使用
x
定义
funcA

const funcA = (callback, arg1) => {
  console.log("Print arg1: " + arg1);
  let x = 0;
  x = callback(x, arg1);
  return x;
}

const funcB = (x, prefix) => {
  console.log("Print prefix: " + prefix);
  x = x + 1;
  return x;
}

/* Exec function funcA */
var x = funcA(x = () => funcB(x = 0 ,"PREFIX_"), "argument1");
console.log("Value of x: " + x);

© www.soinside.com 2019 - 2024. All rights reserved.