一个关于 async await 的调试记录

let request = require('request');

async function getbdstoken() {
  let res = '';
  await request(options, function(error, response, body) {
    let regex = /\"bdstoken\":\"(.*)\",\"quota/;
    res = body.split(regex)[1];
    console.log(res);
  });
  console.log('res', res);
  return res;
}

console.log(getbdstoken());

输出结果如下:

Promise {  }
res 
1779b579e4340c33cf27a89a0c80b420

原因如下:

  • getbdstoken()是个async函数,和普通函数不一样,不会执行完再返回结果,所以会返回Promise { }
  • request函数不是Promiseawait会把该值转换为已正常处理的Promise,而不是将等待Promise正常处理完成并返回其处理结果

如果把上面的 require('request') 改成 require('request-promise'),输出将变成:

Promise {  }
1779b579e4340c33cf27a89a0c80b420
res 1779b579e4340c33cf27a89a0c80b420

正确的代码

let request = require('request-promise');

async function getbdstoken() {
  let res = '';
  await request(options, function(error, response, body) {
    let regex = /\"bdstoken\":\"(.*)\",\"quota/;
    res = body.split(regex)[1];
    console.log(res);
  });
  console.log('res', res);
  return res;
}

getbdstoken().then(res => {
  console.log(res);
});

你可能感兴趣的:(一个关于 async await 的调试记录)