Javascript 如何使包装在函数中的函数代表父函数返回

Javascript 如何使包装在函数中的函数代表父函数返回,javascript,Javascript,我有一个函数,在一个函数里面。我希望父函数返回一个更新的对象(在循环结束后),当前,它返回未定义的对象,因为父函数不返回任何内容,只有子函数函数(项)返回数据。如何使父函数返回更新的返回\u数据?非常感谢 reportParser: (report) => { const return_data = { "click": "[id^='AUTOGENBOOKMARK_75_'].style_12", "clicker": "[id^='AUTOGEN

我有一个函数,在一个函数里面。我希望父函数返回一个更新的对象(在循环结束后),当前,它返回未定义的对象,因为父函数不返回任何内容,只有子函数
函数(项)
返回数据。如何使父函数返回更新的
返回\u数据
?非常感谢

reportParser: (report) => {
    const return_data = {
        "click": "[id^='AUTOGENBOOKMARK_75_'].style_12",
        "clicker": "[id^='AUTOGENBOOKMARK_74_'].style_12",
        "openning": ".style_25 > .style_24",
        "openner": ".style_25 > .style_24",
        "name": "[id^='AUTOGENBOOKMARK_7_'].style_12",
        "subject": "[id^='AUTOGENBOOKMARK_9_'].style_12",
        "audience": "[id^='AUTOGENBOOKMARK_11_'].style_12",
        "sent_mails": "[id^='AUTOGENBOOKMARK_20_'].style_12",
        "send_date": "[id^='AUTOGENBOOKMARK_32_'].style_12",
        "cancel_subscription_click": ".style_25 > .style_24",
        "cancel_subscription_clicker": ".style_25 > .style_24"
    };
    let remaining_keys = Object.keys(return_data).length;
    for (let key in return_data) {
        if (return_data.hasOwnProperty(key)) {
            html2json.parse(report, function () {
                return this.map(return_data[key], function ($item) {
                    return $item.text();
                });
            }).done(function (items) {
                if (key === "click" || key === "clicker" || key === "sent_mails") {
                    items[0] = items[0].replace(/,/g, "");
                    return_data[key] = parseInt(items[0]);
                } else if (key === "openning") {
                    items[items.length - 2] = items[items.length - 2].replace(/,/g, "");
                    return_data[key] = parseInt(items[items.length - 2]);
                } else if (key === "openner") {
                    items[items.length - 3] = items[items.length - 3].replace(/,/g, "");
                    return_data[key] = parseInt(items[items.length - 3]);
                } else if (key === "cancel_subscription_click") {
                    return_data[key] = parseInt(items[13]) + parseInt(items[18]) + parseInt(items[23]);
                } else if (key === "cancel_subscription_clicker") {
                    return_data[key] = parseInt(items[11]) + parseInt(items[16]) + parseInt(items[21]);
                } else {
                    return_data[key] = items[0];
                }
                remaining_keys--;
                if (remaining_keys === 0) {
                    return_data["click"] -= return_data["cancel_subscription_click"];
                    return_data["clicker"] -= return_data["cancel_subscription_clicker"];
                    delete return_data.cancel_subscription_click;
                    delete return_data.cancel_subscription_clicker;
                    logger.debug(return_data);
                    return return_data;
                }
            }, function (err) {
                // Handle error
            });
        }
    }
}

执行将是function->object init->wait for loop to update object->return object

您可以使用回调函数,也可以将此函数作为承诺写入。 Callback是一个函数,您将在数据完成后传递到函数中执行

对于回调函数:

因此,当您使用reportParser时:

reportParser(report, function(return_data) { 
     //whatever you want to do with return_data
})
为了承诺:

当您使用reportParser函数时:

reportParse(report).then(return_data => { 
    //whatever you want to do with return_data
})

您可以使用回调函数,也可以将此函数作为承诺编写。 Callback是一个函数,您将在数据完成后传递到函数中执行

对于回调函数:

因此,当您使用reportParser时:

reportParser(report, function(return_data) { 
     //whatever you want to do with return_data
})
为了承诺:

当您使用reportParser函数时:

reportParse(report).then(return_data => { 
    //whatever you want to do with return_data
})

似乎
html2json.parse
返回一个承诺,因此在您的情况下,您必须在父函数中也返回一个承诺

reportParser:(报告)=>{
常量返回\u数据={
“单击”:“[id^='AUTOGENBOOKMARK\u 75\u'].style\u 12”,
“clicker”:“[id^='AUTOGENBOOKMARK\u 74\u'].style\u 12”,
“打开”:.style\u 25>.style\u 24“,
“openner”:“.style\u 25>.style\u 24”,
“名称”:“[id^='AUTOGENBOOKMARK\u 7\u'].style\u 12”,
“主题”:“[id^='AUTOGENBOOKMARK\u 9\u'].style\u 12”,
“受众”:“[id^='AUTOGENBOOKMARK\u 11\u'].style\u 12”,
“已发送邮件”:“[id^='AUTOGENBOOKMARK\u 20\u'].style\u 12”,
“发送日期”:“[id^='AUTOGENBOOKMARK\u 32\u'].style\u 12”,
“取消订阅\u单击”:“.style\u 25>.style\u 24”,
取消订阅点击器“:.style\u 25>.style\u 24”
};
让剩余的_keys=Object.keys(返回_数据).length;
/*这是你的承诺*/
返回新承诺((解决、拒绝)=>{
for(让输入返回_数据){
if(返回_data.hasOwnProperty(键)){
解析(报告,函数(){
返回此.map(返回数据[key],函数($item){
返回$item.text();
});
}).完成(功能(项目){
如果(键==“点击”| |键==“点击器”| |键==“发送邮件”){
项目[0]=项目[0]。替换(/,/g,”);
return_data[key]=parseInt(项[0]);
}否则如果(键==“打开”){
items[items.length-2]=items[items.length-2]。替换(/,/g,“);
return_data[key]=parseInt(items[items.length-2]);
}否则如果(键==“openner”){
items[items.length-3]=items[items.length-3]。替换(/,/g,“);
return_data[key]=parseInt(items[items.length-3]);
}否则,如果(键==“取消订阅\u单击”){
return_data[key]=parseInt(项目[13])+parseInt(项目[18])+parseInt(项目[23]);
}否则如果(键==“取消订阅\点击器”){
return_data[key]=parseInt(项目[11])+parseInt(项目[16])+parseInt(项目[21]);
}否则{
返回_数据[键]=项[0];
}
剩余的_键--;
如果(剩余的_键===0){
返回数据[“单击”]-=返回数据[“取消订阅”];
返回数据[“点击器”]-=返回数据[“取消订阅点击器”];
删除退货数据。取消预订单击;
删除返回数据。取消订阅单击按钮;
logger.debug(返回_数据);
/*兑现诺言*/
解析(返回_数据);
返回数据;
}
},函数(err){
//处理错误
/*拒绝错误的承诺*/
拒绝(错误);
});
}
}
});

}
似乎
html2json.parse
返回一个承诺,因此在您的情况下,您必须在父函数中也返回一个承诺

reportParser:(报告)=>{
常量返回\u数据={
“单击”:“[id^='AUTOGENBOOKMARK\u 75\u'].style\u 12”,
“clicker”:“[id^='AUTOGENBOOKMARK\u 74\u'].style\u 12”,
“打开”:.style\u 25>.style\u 24“,
“openner”:“.style\u 25>.style\u 24”,
“名称”:“[id^='AUTOGENBOOKMARK\u 7\u'].style\u 12”,
“主题”:“[id^='AUTOGENBOOKMARK\u 9\u'].style\u 12”,
“受众”:“[id^='AUTOGENBOOKMARK\u 11\u'].style\u 12”,
“已发送邮件”:“[id^='AUTOGENBOOKMARK\u 20\u'].style\u 12”,
“发送日期”:“[id^='AUTOGENBOOKMARK\u 32\u'].style\u 12”,
“取消订阅\u单击”:“.style\u 25>.style\u 24”,
取消订阅点击器“:.style\u 25>.style\u 24”
};
让剩余的_keys=Object.keys(返回_数据).length;
/*这是你的承诺*/
返回新承诺((解决、拒绝)=>{
for(让输入返回_数据){
if(返回_data.hasOwnProperty(键)){
解析(报告,函数(){
返回此.map(返回数据[key],函数($item){
返回$item.text();
});
}).完成(功能(项目){
如果(键==“点击”| |键==“点击器”| |键==“发送邮件”){
项目[0]=项目[0]。替换(/,/g,”);
return_data[key]=parseInt(ite