【问题标题】:Waiting for the result from callback before reducing在减少之前等待回调的结果
【发布时间】:2023-03-16 06:15:01
【问题描述】:

我想知道我是否能够使用setTimeout 完成这项工作。 函数together 必须采用funcs,这是一个异步函数列表以及pred 和n。 每个函数都必须调用callback,它必须返回一个值或一个错误。 如果我删除setTimeout 并只留下return cb(...),它会起作用,但我想在每个函数中调用callback 之前setTimeout。 together 必须返回一个被 pred 接受的结果数组,例如如果pred > 10,results 只包含大于 10 的值。

我的代码:

function fun1(value,cb) {
    if ((value * 100) > 400)  {
        return setTimeout(() => cb(null, value*100), 2000)
    }
    else {
      return cb(new Error("error"))
    }
}
function fun2(value,cb) {
    if ((value * 20) > 50)  {
        return setTimeout(() => cb(null, value*20), 2000)
    }
    else {
      return cb(new Error("error"))
    }
}

function fun3(value,cb) {
    if ((value -30 ) > 0)  {
      return setTimeout(() => cb(null, value-30), 2000)
    }
    else {
      return cb(new Error("error"))
    }
}
function callback(err, wyn) {
    if (err) {
        console.log(err)
    }
    else {
        return wyn
    }


}
//console.log(fun1(1000,callback))

const together = (funcs, pred) => (n) => {
    let results = []
    funcs.reduce((prev,curr) => {
        if (curr(n,callback) > pred) {
            results.push(curr(n,callback))
        }

    }, 0)
    return results
};

console.log(together([fun1,fun2,fun3], 5)(10))

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    您应该使用Promises 和Promises.all 来获取这些promise 的值。您可以使用then/catch 或async/await。

    function fun1(value,cb) {
       return new Promise ((res, rej) => {
          if ((value * 100) > 400)  {
            return  setTimeout(() => res(cb(null, value*100)), 2000);
        }
        else {
          rej(cb(new Error("error")));
        }
       })
       
    }
    function fun2(value,cb) {
        return new Promise ((res, rej) => {
          if ((value * 20) > 50)  {
            setTimeout(() => res(cb(null, value*20)), 2000);
        }
        else {
          rej(cb(new Error("error")))
        }
       })
       
    }
    
    function fun3(value,cb) {
       return new Promise ((res, rej) => {
          if ((value -30 ) > 0)  {
          setTimeout(() => res(cb(null, value-30)), 2000)
        }
        else {
          rej(cb(new Error("error")));
        }
       })
        
    }
    function callback(err, wyn) {
        if (err) {
            console.log(err)
        }
        else {
            return wyn
        }
    
    
    }
    //console.log(fun1(1000,callback))
    
    const together = (funcs, pred) => (n) => {
        let results = []
        funcs.forEach((func) => {
                results.push(curr(n,callback))
           
        })
        // if any of your callback returns rejection it will not give values
        Promise.all(results).then(values => { 
         //values will be an array
        console.log(values[0])
       }).catch(console.log);
    };
    
    console.log(together([fun1,fun2,fun3], 5)(10))
    
    

    不要使用reduce,而是使用forEach或for循环,检查何时使用reduce方法。

    【讨论】:

    • 如果这对您有用,您可以接受答案,它将为两者都奖励积分。谢谢!
    • 顺便说一句。为什么我不能在这里使用 reduce?如果我想使用 reduce 怎么办?
    • 如果 (func(n,callback) > pred) 在这个 forEach 中我能做些什么?它不起作用
    • 因为你 cb 本质上是异步的。您可以进行同步调用,因为您的后续请求基于 cb 值,并且 for 循环本质上始终是同步的。
    • 是的,您可能需要使用包装器来处理它并生成自定义错误消息。此外,如果您想按顺序运行该函数,则需要使用生成器函数。
    猜你喜欢
    • 2019-08-06
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多