Как обрабатывать вложенные обещания в JavaScript? - PullRequest
0 голосов
/ 24 июня 2018

Мне нужно решение этой проблемы, которая у меня есть.

У меня есть список обещаний outer_promises_list.

Внутри обещания. После каждого обещания в этом outer_promises_list у меня есть еще один список обещаний inner_promises_list

То, что я хочу, - это метод, который вызывается, когда все внешние обещания и все обещания внутри них разрешаются.

Вот мой код для получения контекста:

fetch = require("node-fetch") 

function all_promises_resolved_method() {
    console.log("All promises resolved ! ");
}


function start_main_process() {
    let outer_promises_list = []
    let inner_promises = []


    start_urls_list.forEach(url => {
        outer_promises_list.push(fetch(url).then(resp => resp.text()))
    })


    outer_promises_list.forEach((outer_prom) => 
        {
            outer_prom.then(htmlbody => 
            {

                inner_promises = inner_promises.concat(get_theater_promises());
                inner_promises.forEach(inner_prom => {
                    inner_prom.then(inner_resp => {

                        inner_resp.clone().text().then(inner_html_body => {
                            console.log("do synchronous stuff on this html body ");
                        })
                    })
                })
            })


            console.log("inner promises skipped , will be resolved later ");

            Promise.all(inner_promises.concat(outer_promises_list)).then(all_promises_resolved_method)

        })
}





function get_inner_promises() {
    inner_promises = []
        [url1, url2, url3].forEach((url)=>{

            inner_promises.push(fetch(href))

        })

return inner_promises;
}


start_main_process() ; 

Моя проблема в том, что all_promises_resolved_method вызывается только тогда, когда внутренние_произведения первого внешнего обещания разрешены. Мне нужно решение для вызова этого метода, когда все внешние обещания и каждое из этих внутренних обещаний разрешены. Какой самый простой и эффективный способ сделать это?

1 Ответ

0 голосов
/ 24 июня 2018

Кажется, вы пропустили несколько вещей в своем псевдокоде или есть какая-то опечатка.Кроме того, вы звоните Promise.all на outer_promises_list и inner_promises дважды, не знаю почему.В любом случае, вот мое решение.

Пожалуйста, помните, что JS Promise разработан, чтобы избежать вложенного кода.Поэтому, если вы используете обещания во время вложения обратных вызовов или обещаний, скорее всего, вы делаете это неправильно.

fetch = require("node-fetch")

function all_promises_resolved_method() {
    console.log("All promises resolved ! ");
}


function start_main_process() {
    let outer_promises_list = []
    let inner_promises = []

    start_urls_list.forEach(url => {
        outer_promises_list.push(fetch(url).then(resp => resp.text()))
    })


    Promise.all(outer_prom)
        .then(htmlbodyArr => {//it is an array of resolved values from all the promises in outer_prom
            /*
               I don't know how you are using htmlBody to create inner promise.
               Following is my best guess
             */

            htmlbodyArr.forEach((htmlBody)=>{
                inner_promises.push(get_theater_promises(htmlBody));
            })
            return inner_promises;
        })
        .then((inner_promises)=>{
            return Promise.all(inner_promises)
        })
        .then((innerPromiseResultArr)=>{
            all_promises_resolved_method();
        })
        .catch((err)=> console.log(err))

/*
    outer_promises_list.forEach((outer_prom) =>
    {
        outer_prom.then(htmlbody =>
        {

            inner_promises = inner_promises.concat(get_theater_promises());
            inner_promises.forEach(inner_prom => {
                inner_prom.then(inner_resp => {

                    inner_resp.clone().text().then(inner_html_body => {
                        console.log("do synchronous stuff on this html body ");
                    })
                })
            })
        })


        console.log("inner promises skipped , will be resolved later ");

        Promise.all(inner_promises.concat(outer_promises_list)).then(all_promises_resolved_method)

    })
    */
}





function get_inner_promises() {
    inner_promises = []
        [url1, url2, url3].forEach((url)=>{

        inner_promises.push(fetch(href))

    })

    return inner_promises;
}


start_main_process() ; 
...