在expressjs fetch中嵌套异步/等待

到目前为止,我的 API 中间件代码可以正常工作。我真的很想确保我的快递服务器中没有任何阻塞调用。所以我还制作了包含异步获取的函数。


我的问题是,这有必要吗?因为实际上第一个 await 应该已经解锁了我的快递服务器,对吗?


这是代码:


var express = require('express')

var router = express.Router()

const asyncMiddleware = require('./utils/asyncMiddleware');


async function fetchCall(URL, bodyJson, wpToken) {      

    try {        

        return await fetch(URL, {

            method: "POST",

            credentials: "same-origin",

            headers:  {

                "Authorization": "Bearer " + wpToken,

                "Content-Type": "application/json",

                "Accept": "application/json"

            },

            body: bodyJson

    });

    } catch (error) {       

        return {status:544, error:error};

    }

}


router.post("/registerVendor", asyncMiddleware(async (req, res, next) => {              

    const response = await fetchCall(myApiUrl, req.body, 1)

    return res

    .status(response.status)

    .send({ data: response});

}));


module.exports = router


慕虎7371278
浏览 232回答 1
1回答

幕布斯6054654

如果问题是,你必须把你fetch在一个单独的async功能,答案是否定的,你不具备对。它可能对你有用,但你没有必要。正如你所说,如果你直接等待fetch承诺,那将结束你的async路由回调的同步部分。我的问题是,如果这个函数(在我的代码示例中为“fetchCall”)必须是异步的。不,它没有。它甚至不必返回承诺,因为您可以使用await任何值。例如,以下按顺序记录 A、B、C、D 和 E:async function foo() {    console.log("B");    await 42;    console.log("D");}console.log("A");foo().then(() => {    console.log("E");}).catch(error => {    console.error(error);});console.log("C");在你的情况下,当然,你想返回一个承诺。:-) 这会起作用:function fetchCall(URL, bodyJson, wpToken) {          return fetch(URL, {        method: "POST",        credentials: "same-origin",        headers:  {            "Authorization": "Bearer " + wpToken,            "Content-Type": "application/json",            "Accept": "application/json"        },        body: bodyJson    })    .catch(error => ({status:544, error:error}));}也就是说,async/的优点await是它可以使用我们熟悉的同步代码中的分支和循环结构编写异步代码......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript