Javascript 将回调传递到异步函数中,甚至再次包装它,这正常吗?

Javascript 将回调传递到异步函数中,甚至再次包装它,这正常吗?,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,app.js import test from "./asyncTest"; test().then((result)=>{ //handle my result }); asyncTest.js const test = async cb => { let data = await otherPromise(); let debounce = _.debounce(() => { fetch("https://jsonplaceho

app.js

import test from "./asyncTest";
    test().then((result)=>{
    //handle my result
});
  • asyncTest.js

    const test = async cb => {
        let data = await otherPromise();
        let debounce = _.debounce(() => {
    
       fetch("https://jsonplaceholder.typicode.com/posts/1")
            .then( => response.json())
            .then(json => json );
        }, 2000);
    };
    export default test;
    
  • 我打算返回的获取结果“json”无法作为“test”函数的返回值,因为该值仅在内部函数范围(如debounce wrapper)中可用。由于上述原因,我尝试传递一个回调函数,并将回调包装为承诺函数(pTest),如下所示

    const test = async cb => {
      let debounce = _.debounce(() => {
        fetch("https://jsonplaceholder.typicode.com/posts/1")
          .then(response => response.json())
          .then(json => cb(null, json))
          .catch(err => cb(err));
      }, 2000);
    };
    const pTest = cb => {
      return new Promise((resolve, reject) => {
        test((err, data) => {
          if (err) reject(err);
          resolve(data);
        });
      });
    };
    export default pTest;
    

    这种方法对我来说很有效,但我想知道它是否正确,或者是否有任何方法可以解决这种情况?

    获取API已经返回了一个承诺。用另一个Promise对象包装它实际上是一种反模式。它与下面的代码一样简单:

    /*导出*/async函数测试(){
    让数据=等待其他承诺();
    返回取回(“https://jsonplaceholder.typicode.com/posts/1")
    .then(response=>response.json())
    。然后(json=>{
    返回{
    json:json,
    数据:数据
    }
    });
    };
    函数otherPromise(){
    返回新承诺((解决、拒绝)=>{
    解析(“数据值测试”);
    });
    }
    //在index.js调用中
    test()。然后(res=>{
    console.log(res)
    
    });async
    而不使用
    wait
    的代码>没有任何实用程序。取消获取请求的公告的目的是什么?我必须在测试函数中使用其他等待承诺。刚刚编辑过,谢谢。使用deounce的目的并不重要,我试图表示需要返回的值在另一个函数中。setTimeout可能是一个更好的例子。我修改了我的答案,加入了你的等待。请检查您能正确缩进代码吗?这真的很难读。另外,您的
    test
    函数不返回任何内容,并且从不调用取消公告的函数,这是有意的吗?对于初学者,您应该将return添加到fetch函数调用中,以便它返回链接承诺。此外,异步cb没有意义,您没有在回调“模式”中使用它,但在承诺模式中,我看到您无论如何都没有使用它,但这对读者来说非常混乱。请删除
    async
    wait
    。这里既不需要也不有用。您只是从一个常规函数返回一个承诺。@jfriend00-OP希望对其他异步函数进行操作,并将测试函数内部和测试外部的响应作为返回值。也希望以同步方式执行此操作。
    return await fetch()
    没有任何意义。等待
    是毫无意义的。
    async
    函数始终返回承诺。所以,只需执行
    return fetch()…
    是的,我现在当然明白你的意思了——这是在蒙蔽我自己。谢谢这样,我必须将返回值保持在测试函数的顶层,有时这很困难,例如使用deound包装器。但当传递回调并将其包装到pTest时,我可以通过调用测试函数中任何位置的cb(数据)来传递值。解决方案仍然是好的。谢谢你,伙计。