JS 返回回调函数的返回值 分别使用回调函数和Promise

刚才看了其他几篇文章,知道了是用回调函数/promise/await,但还是不知道自己的代码怎么修改,求大佬帮忙,感谢

function findJson(str, callback) {
  // str参数表示用户的账号(手机号)
  fs.readFile('./public/json/index.json', function (err, data) {
    if (err) {
      return console.error(err);
    }
    let allUser = data.toString();
    allUser = JSON.parse(allUser);
    user = allUser.find(function (user) {
      return user.id === str;
    })
    callback && callback(user);
    // 我希望findJson函数可以把user给return出来
  })
}
console.log(findJson('11111111111', (a)=>{return a}));

这是用回调函数的代码,但可能是我还没理解,所以还是有问题...求大佬改一下,然后再发一下用promise的代码,Orz

阅读 2.9k
2 个回答
function findJson(str, callback) {
  // str参数表示用户的账号(手机号)
  return new Promise((res, rej) => {
    fs.readFile('./public/json/index.json', 
      function (err, data) {
        if (err) {
          rej(err)
          return console.error(err);
          }
        let allUser = data.toString();
        allUser = JSON.parse(allUser);
        user = allUser.find(function (user) {
          return user.id === str;
        })
        callback && callback(user);
        res(user)
        // 我希望findJson函数可以把user给return出来
    })
  })
  
}

findJson('11111111111').then(user => {
  console.log(user)
}).catch(err => {
  console.log(user)
})
// or
try() {
  const user = await findJson('11111111111')
  console.log(user)
} catch(err) {
  console.log(err)
}

异步的概念可以这样理解:你等不到它的返回,因为你不知道它什么时候会完成。所以你只能告诉它完成之后干什么,也就是通过传入一个任务(回调函数)告诉它接下来的任务。而作为一个回调,返回值一般是没有意义的,除非接受这个回调函数的接口明确说明了它会使用返回值(在异步的情况吓很少会有这种情况,同步回调的返回值到是经常会有用)

Promise 可以把零散的异步回调管理起来,穿成一条线,一直 next() 下去……比较符合我们看待连续任务的思维,但 then() 中还是给的一个回调,只不过这个回调的返回值变得有意义,因为它会用到下一个 next() 回调中。Promise 的关键就在于“传递”

await 语法则是把基于 Promise 的异步过程,从语法层面处理得像同步一样,这更符合习惯了写同步代码的大多数程序员,算是个非常非常甜的语法糖。

推荐阅读:

也可以直接到我专栏边城客栈去找,不少关于异步的内容

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题