0

I am trying to figure out how to make the following piece of code use await. Could someone give me an example of how it should look like and the logic behind it?

    const makeReq = (options) =>{
        let promise = new Promise((resolve,reject) => {
            pm.sendRequest(options, (error, response) => {
                console.log('response: ',response.json())
                if(error){
                    console.log('error:',error);
                }
                if(!error){
                    resolve(response.json());
                }
                else{
                    reject(error);
                }
            });
        });

        return promise;
    }
    
    const asyncReq = async (options) =>{

        return makeReq(options)
        
        .then(res =>{
            return res;
        })

        .catch(err => {
            console.warn('errors ending req ',err);
        })
    }

    let libraryExport = {
        checkResponseBody,
        asyncReq
    };

    return libraryExport;
   
}
4

1 回答 1

2

让我们从async关键字开始。它可以放在函数之前,如下所示:

async function f() {
  return 1;
}

函数前面的词async意味着一件简单的事情:函数总是返回一个承诺。其他值自动包装在已解决的承诺中。

例如,此函数返回一个已解决的 Promise,其结果为 1;让我们测试一下:

async function f() {
  return 1;
}

f().then(alert); // 1

我们可以显式返回一个承诺,这将是相同的:

async function f() {
  return Promise.resolve(1);
}

f().then(alert); // 1

因此,async确保函数返回一个承诺,并在其中包装非承诺。很简单,对吧?但不仅如此。还有另一个关键字 ,await只在函数内部async起作用,而且非常酷。

AWAIT :该关键字await使 JavaScript 等待,直到该承诺解决并返回其结果。这是一个承诺在 1 秒内解决的示例:

async function f() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("done!"), 1000)
  });
  let result = await promise; // wait until the promise resolves (*)
  alert(result); // "done!"
}
f();

错误处理:如果一个promise正常解析,那么awaitpromise返回结果。但是在拒绝的情况下,它会抛出错误,就像在该行有一个 throw 语句一样。

async function f() {
  await Promise.reject(new Error("Whoops!"));
}

结论async函数前的关键字有两个作用:

使它总是返回一个承诺。允许await在其中使用。Promise 之前的await关键字使 JavaScript 等到该 Promise 完成,然后:

如果它是一个错误,就会产生异常——就像在那个地方调用了 throw error 一样。否则,它返回结果。它们一起提供了一个很好的框架来编写易于阅读和编写的异步代码。

使用async/await我们很少需要写Promise.then/ catch,但我们仍然不应该忘记它们是基于 Promise 的,因为有时(例如在最外层范围内)我们必须使用这些方法。Promise.all当我们同时等待许多任务时也很好。

于 2021-03-16T23:12:16.540 回答