在回调之外访问数组

时间:2018-03-31 23:35:03

标签: javascript node.js express web-scraping request-promise

我正在尝试使用 NodeJS 通过一些基本的网页抓取来构建具有各种键值的对象数组。对于我的代码库的后续步骤,我需要访问'内置的'父函数之外的数组,如您所见:

rp.post(login)

请注意我正在使用快递,请求承诺和& cheerio 作为我的主要npm依赖项。

let orderArray = []; // Create Empty Array   

// Login
rp.post(login, function(err, res, body) {

    // Set Cookie Jar
    cookieJar = res.headers['set-cookie'];

    // Get Order Numbers
    rp(getOpenOrders).then(function ($) {

        // Check Amount of Open Orders
        let openOrderTableLength = $('tbody tr').length;

        // Build Out Information
        for (let i = 0; i < openOrderTableLength; i++) {

            let order = {
                vendor: "example vendor",
                vendorNum: $('a.show-progress-on-click').eq(i).text(),
                vendorNumLink: "https://www.vendor.com." + $('a.show-progress-on-click').eq(i).attr('href'),
                status: $('td.w200:nth-of-type(5)').eq(i).text(),
                dates: {
                    ordered: $('td.w100:nth-of-type(3)').eq(i).text(),
                    eta: "TBA",
                    shipped: "TBA",
                    arrived: "TBA",
                },
                courier: "TBA",
                trackingNum: "TBA",
                dropShip: false,
                items: []
            }

            if (order.status === "Backorder") {

                // Get details from specific
                rp({
                    uri: order.vendorNumLink,
                    cookie: cookieJar,
                    transform: body => cheerio.load(body)
                })


                .then(function ($) {

                    // Get length of items within
                    let backOrderItemsTableLength = $('tbody tr').length;

                    // Build out all the items
                    for (let j = 0; j < backOrderItemsTableLength; j++) {
                        let orderItem = {
                            sku : "TBA",
                            description: "TBA",
                            orderQty: "TBA",
                            allocQty: "TBA",
                            bOrderQty: "TBA",
                            eta: $('td:nth-of-type(6)').eq(j).text(),
                            unitCost: "TBA",
                            subTotal: "TBA",
                        }
                        order.items.push(orderItem);
                    }

                    orderArray.push(order);

                    console.log(orderArray) // Displays a filled array

                })
            }
        }
    })
});

console.log(orderArray) // Returns an empty array

正如您将在本代码的最后一部分中看到的那样,我已经标记了数组的工作位置以及我需要在父函数之外访问它的位置。

                    orderArray.push(order);

                    console.log(orderArray) // Displays a filled array

                })
            }
        }
    })
});

console.log(orderArray) // Returns an empty 

我要求提供访问&#39; Built&#39;在内置函数之外的数组,除此之外,有人可以在适当的时间提供一些信息来完成返回回调()返回回调()< / strong>我假设将在这里解决我的问题?

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

好的 - 所以我只是想出来了,我仍然没有完全掌握返回,回调()或返回回调()的用例,但是,我确实找到了我需要的东西在这里做:

首先 - 我将代码包裹在命名函数中,如下所示:

function getInfo (callback){

    // Insert all my original code here

};

其次 - 我将 callback(); 添加到构建数组正确记录的部分:

                }

                orderArray.push(order);
                callback();

            })

第三 - 我用匿名函数再次调用我现在命名的函数:

getInfo (function(){
    console.log(orderArray);
});

当我启动NodeJS应用程序时,它会从我需要的位置记录信息。

我仍然愿意接受更好地构建代码的提示,但是,这已经解决了我的问题,以防其他人遇到同样类型的问题。