Promise.all([ anotherPromise, anotherPromise ]) 当嵌套 promise 时父级没有阻塞

Oma*_*mar -1 javascript node.js typescript

在以下示例中,get_bc_templates()返回 before get_bc_template()

async get_bc_templates(mfpns, cnetDB, cb) {
    const templates = await Promise.all([mfpns.map(async item => await this.get_bc_template(item, cnetDB))]);
    if (cb) {
        console.log(`prints immediately. before get_bc_template`.green.bold, templates)
        return cb(200, templates.map(template => template.bigCommerce_object))
    }
}




async get_bc_template(mfpn, cnetDB, cb ?) {
    console.log('this logs after the get_bc_templates already returns', mfpn);
    let collective_product = {
        CNET_data: promised_data[1],
        JAX_data: JAX_data,
        suggested_retail: await this.calc_suggested_retail(JAX_data),
        }
    return collective_product;
}


Run Code Online (Sandbox Code Playgroud)

我需要帮助重写它,因此get_bc_templates返回一个数组get_bc_template() => collective_product(get_bc_template() 一次很好用)。

Luc*_*bre 5

Promise.all 需要一个数组作为参数,你传递的是一个数组的数组: [mfpns.map(async item => await this.get_bc_template(item, cnetDB))]

map 函数已经返回一个数组。所以,你所拥有的是一个数组中的一系列承诺:Promise.all([[promise, anotherPromise, ...]])

因此Promise.all将尝试只等​​待数组,而不是里面的承诺。

您应该删除map函数周围的数组括号:

const templates = await Promise.all(mfpns.map(async item => await this.get_bc_template(item, cnetDB)));
Run Code Online (Sandbox Code Playgroud)