代码之家  ›  专栏  ›  技术社区  ›  Ari

向返回回调传递额外参数

  •  0
  • Ari  · 技术社区  · 7 年前

    我正在使用以下格式的库函数:

    let arr = [1,2,3]
    arr.forEach((item, i) =>{
        doSomething(inputParam, (err, result)=>{
            ...
            //Use err and result
        });
    
    })
    

    err result 设置在我尚未开发的库函数中。

    如何传递额外参数 i 到回调函数?

    注: 我想要 在每个回调中对应于正确的索引。因为它们是异步的,当它们完成时,它们都会看到i的最后一个值,这不是我想要的。例如,第二个回调应该看到i=2,第三个回调应该看到i=3。

    我需要这样的东西:

    let arr = [1,2,3]
    arr.forEach((item, i) =>{
        doSomething(inputParam, (err, result, i)=>{
            ...
            //Use err and result
            console.log("i: ", i);
        });
    
    })
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   jfriend00    7 年前

    您不控制回调的参数这些是由调用方设置的,调用方是 doSomething() 你说的功能不是你能控制的。所以,不要试图添加来电者没有设置的内容。那只会把你搞砸。

    相反,由于使用的是内联回调,因此只需直接访问父作用域中的变量,而不必将它们定义为回调的参数。这是Javascript的一个很好的特性(可以访问父范围变量的内联回调)。

    下面是一个可运行的示例:

    let arr = [1, 2, 3];
    let inputParam = "something";
    
    arr.forEach((item, i) => {
        doSomething(inputParam, (err, result) => {
            // you can access variables such as i in the parent scope here
            // from an inline callback
    
            //Use err and result
            console.log("i: ", i);
        });
    });
    
    function doSomething(param1, callback) {
        // simulate async callback
        setTimeout(function() {
            callback(null, "hello");
        }, 100);
    }

    如果需要使用非内联的回调(类似于在另一个模块中定义的回调),可以创建一个小的内联回调存根,然后可以访问父范围的变量,然后可以使用所需的参数调用外部定义的函数。

    let arr = [1, 2, 3];
    let inputParam = "something";
    
    function yourExternalFunction(err, result, i) {
        // Use err and result and i
        console.log("i: ", i);
    }
    
    arr.forEach((item, i) => {
        doSomething(inputParam, (err, result) => {
            // you can access variables such as i in the parent scope here
            // from an inline callback
            yourExternalFunction(err, result, i) ;
        });
    });
    
    function doSomething(param1, callback) {
        // simulate async callback
        setTimeout(function() {
            callback(null, "hello");
        }, 100);
    }
        2
  •  0
  •   Get Off My Lawn    7 年前

    你的第二次尝试已经接近了,只要把 i 之后 result ,它会起作用的

    这是一篇关于 JavaScript Scope

    let arr = [1, 2, 3]
    arr.forEach((item, i) => {
      doSomething('inputParam', (err, result) => {
        console.log("i: ", i);
      })
    })
    
    function doSomething(param, callback) {
      callback('Error', 'Result')
    }