async/await implicitly returns promise?

前端 未结 5 1981
离开以前
离开以前 2020-11-22 12:06

I read that async functions marked by the async keyword implicitly return a promise:

async function getVal(){
 return await doSomethingAync();
}         


        
5条回答
  •  孤街浪徒
    2020-11-22 12:37

    async doesn't return the promise, the await keyword awaits the resolution of the promise. async is an enhanced generator function and await works a bit like yield

    I think the syntax (I am not 100% sure) is

    async function* getVal() {...}

    ES2016 generator functions work a bit like this. I have made a database handler based in top of tedious which you program like this

    db.exec(function*(connection) {
      if (params.passwd1 === '') {
        let sql = 'UPDATE People SET UserName = @username WHERE ClinicianID = @clinicianid';
        let request = connection.request(sql);
        request.addParameter('username',db.TYPES.VarChar,params.username);
        request.addParameter('clinicianid',db.TYPES.Int,uid);
        yield connection.execSql();
      } else {
        if (!/^\S{4,}$/.test(params.passwd1)) {
          response.end(JSON.stringify(
            {status: false, passwd1: false,passwd2: true}
          ));
          return;
        }
        let request = connection.request('SetPassword');
        request.addParameter('userID',db.TYPES.Int,uid);
        request.addParameter('username',db.TYPES.NVarChar,params.username);
        request.addParameter('password',db.TYPES.VarChar,params.passwd1);
        yield connection.callProcedure();
      }
      response.end(JSON.stringify({status: true}));
    
    }).catch(err => {
      logger('database',err.message);
      response.end(JSON.stringify({status: false,passwd1: false,passwd2: false}));
    });
    

    Notice how I just program it like normal synchronous particularly at

    yield connection.execSql and at yield connection.callProcedure

    The db.exec function is a fairly typical Promise based generator

    exec(generator) {
      var self = this;
      var it;
      return new Promise((accept,reject) => {
        var myConnection;
        var onResult = lastPromiseResult => {
          var obj = it.next(lastPromiseResult);
          if (!obj.done) {
            obj.value.then(onResult,reject);
          } else {
           if (myConnection) {
              myConnection.release();
            }
            accept(obj.value);
          }
        };
        self._connection().then(connection => {
          myConnection = connection;
          it = generator(connection); //This passes it into the generator
          onResult();  //starts the generator
        }).catch(error => {
          reject(error);
        });
      });
    }
    

提交回复
热议问题