简体   繁体   中英

How do I use async-await properly in the following situation?

I'm struggling with async await block. I have looked the multiple resources on the net but I just can't understand what I'm doing wrong here:

app.post('/api/my-api', async (req, res, next) => {
try {
    filecontent = req.files.userFile.data.toString('utf8')
    console.log("decoded file : ", filecontent);
    let encoded_file = new Buffer(filecontent).toString('base64');
    var apiClass = new RPC("http://localhost:1006", "my-api");

    //the asynchronous function :
    const answ = await apiMethod.call("api", [{"file" : encoded_file, "fileName":req.files.userFile.name}], res.json);

    //the code I'd like to execute only after the previous function has finished :
    console.log("answer : ", answ);
    console.log("answering...");
    res.json(answ);
} catch (err) {
    console.log(err);
}

Apparently my console.log are executed before the the await line is done. I can tell because there's a console.log() in the asynchronous function too, and my res.json is sent before I receive answ .

How do I make sure the asynchronous function finishes before the rest of the code?

Edit: here is the apiMethod.call function:

call(id, params) {
    let options = {
        url: this.url,
        method: "post",
        headers:
        { 
         "content-type": "text/plain"
        },
        body: JSON.stringify( {"jsonrpc": "2.0", "id": id, "method": this.procedure, "params": params })
    };
    console.log(options);
    request(options, (error, response, body) => {
        if (error) {
            console.error('An error has occurred: ', error);
        } else {
            console.log('Post successful: response: ', body);
        }
    });
}

Issue is in call function. Since it has async code ( request call), it should be wrapped in promise which should resolve from callback function of request .

Updating call function to something like below should help:

function call(id, params) {
  return new Promise((resolve, reject) => {
    let options = {
      url: this.url,
      method: "post",
      headers: {
        "content-type": "text/plain",
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: id,
        method: this.procedure,
        params: params,
      }),
    };
    console.log(options);
    request(options, (error, response, body) => {
      if (error) {
        console.error("An error has occurred: ", error);
        reject(error);
      } else {
        console.log("Post successful: response: ", body);
        resolve(body);
      }
    });
  })
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM