【问题标题】:How to use callback asynchronously如何异步使用回调
【发布时间】:2018-04-22 05:46:53
【问题描述】:

console.log("before")

function g(p,callback){
    callback('1')
}

g(1,(re)=>{
    console.log(re);
})

console.log("after")

结果是前1后。 如何使函数调用异步意味着结果应该是 before after 1 没有 setTimeout 函数

用例是这样的

我在一个函数内部有一个 api 调用,并在这个函数调用之后发送响应。但是因为这个函数被同步调用,所以发送响应被延迟了。所以我想在 api 调用之前发送响应

console.log("before callback")

apiRes.url = [url];
apimanager.callfunc(requestBody, apiRes,(err,success)=>{
    console.log("success ",success)
    console.log("inside callback");
});

console.log("after callback")

return response.json(someresponse)

【问题讨论】:

  • 改用承诺
  • 它的用例是什么?或者你只是在研究 Javascript?
  • 我在一个函数内部有一个 api 调用,并在这个函数调用之后发送响应。但是因为这个函数被同步调用,所以发送响应被延迟。所以我想在 api 调用之前发送响应 console.log( "回调前") apiRes.url = [url]; apimanager.callfunc(requestBody, apiRes,(err,success)=>{ console.log("success",success) console.log("内部回调"); }); console.log("回调后") return response.json(someresponse)
  • No..它的打印 beforecallback insidecallback aftercallback..我共享的类似代码 sn-p..我需要 before after inside..
  • 这听起来像是 X/Y 问题。在基本层面上,我会考虑将其关闭为“使同步函数异步”的副本,但我认为这实际上并不能解决您面临的问题。想扩展一下你的真实代码中实际发生的事情吗?

标签: javascript node.js


【解决方案1】:

你可以使用Promise.resolve():

console.log("before")

function g(p, callback) {
  callback('1')
}

g(1, (re) => {
  Promise.resolve().then(() => {
    console.log(re);
  });
})

console.log("after")

【讨论】:

    【解决方案2】:

    你仍然可以很好地使用 setTimeout,如果你想将你的回调安排到“下一个刻度”,它没有任何问题,只是不要为此使用间隔参数,回调将在需要时异步调用:

    console.log("before")
    
    function g(p, callback) {
      setTimeout(function () { callback('1') })
    }
    
    g(1, (re) => {
      console.log(re);
    })
    
    console.log("after")

    【讨论】:

    • 我有超过 100 个函数调用和类似情况..我无法为每个函数调用编写 setTimeout 包装器..它会增加代码行数并且会变得不可读
    • @BittuS 听起来您在编写 DRY 代码时遇到了问题。这并不会使这种方法无效。
    • @BittuS 我不知道你的问题到底是什么,为什么你需要强制执行异步。您的代码应该没问题,只要它符合您的函数的 API,即使用回调函数。不管是同步还是异步。但无论如何,无论你使用 Promises 还是 setTimeout,你都需要那些额外的行,而且你真的没有其他选择。
    【解决方案3】:

    对异步函数使用像 g() 这样的回调函数会有点像这样。

    首先我们需要函数

    function g (p,callback){
     callback(p)
    };
    

    太棒了。现在让我们使用它调用 async 函数

    fs.readFile('hello.txt','utf8',function(err,data){//readFile is async
      if(err)throw Error;
    
      g(data, console.log)//use our callback
    });
    

    多多! g 将使用带有参数data 的console.log。如果可行,请标记为答案。

    更多信息here

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2022-07-27
      • 1970-01-01
      • 2012-06-03
      • 2017-07-19
      • 2017-09-09
      • 2012-01-20
      • 2018-08-22
      • 2018-04-06
      相关资源
      最近更新 更多