Javascript nodeJS:承诺在for循环完成之前执行,回调堆栈

Javascript nodeJS:承诺在for循环完成之前执行,回调堆栈,javascript,node.js,promise,Javascript,Node.js,Promise,我正在使用promise创建对结果数组的Postman的响应;但是,resolve()在forEach循环完成之前被调用,而resolve()在forEach循环之外。我觉得这是由于回调堆栈的功能 考虑到回调堆栈,在forEach循环完成执行后,如何执行resolve() (server.js): 在任何响应到达之前,您正在调用resolve() 您需要将request()包装到一个函数中,该函数返回一个承诺(单个请求),然后写入 Promise.all(result.map(e =>

我正在使用
promise
创建对
结果数组的Postman的响应;但是,
resolve()
在forEach循环完成之前被调用,而
resolve()
在forEach循环之外。我觉得这是由于回调堆栈的功能

考虑到
回调堆栈,在forEach循环完成执行后,如何执行
resolve()


(server.js):


在任何响应到达之前,您正在调用
resolve()

您需要将
request()
包装到一个函数中,该函数返回一个承诺(单个请求),然后写入

Promise.all(result.map(e => requestPromise(...)))

等待所有这些承诺。

应该更接近你所需要的

logServer.post('/log/asset/audit/', function (req, res) {
    console.log('--- starting log/asset/audit');

    logDB.collection('logs')
        .find({ "transaction.assetName": assetName, "transaction.assetOwner": assetOwner })
        .toArray((err, result) => {
            let token = JSON.parse(JSON.stringify(self_jwt_body));

            var JSONPromise = new Promise((resolve, reject) => { //initialization      

                let async_result = result.map(function (element, index, array) {
                    console.log('- before request.post');

                    return new Promise((resolve,reject)=>{
                        request.post({
                            url: `${dc_link}/audit`, //includes dc_IP, dc_port and /audit
                            headers: {
                                "jwt": jwt.sign(token, jwtSecret)
                            }
                        }, function (error, response, body) {
                            console.log('path 0');
                            let parseBody = JSON.parse(body);

                            console.log('path 3');
                            result[0].transaction.signature = parseBody.additionalData;
                            console.log('result: ', result);
                            resolve();
                            //**HERE
                        });
                    });
                });
                //**HERE

                return Promise.all(async_result);


            });  //end callback

            JSONPromise.then(() => {  //finalization  //**HERE
                respondWithJSON(200, req.body.result, req.body.description, res, result);
                console.log('end log/asset/audit');
            });
        });
});

是否要在所有post()调用完成后调用resolve?是的,例如,在对结果数组进行所有修改后,再调用resolve()并调用respondWithJSON@SLaks反应看起来不错。
logServer.post('/log/asset/audit/', function (req, res) {
    console.log('--- starting log/asset/audit');

    logDB.collection('logs')
        .find({ "transaction.assetName": assetName, "transaction.assetOwner": assetOwner })
        .toArray((err, result) => {
            let token = JSON.parse(JSON.stringify(self_jwt_body));

            var JSONPromise = new Promise((resolve, reject) => { //initialization      

                let async_result = result.map(function (element, index, array) {
                    console.log('- before request.post');

                    return new Promise((resolve,reject)=>{
                        request.post({
                            url: `${dc_link}/audit`, //includes dc_IP, dc_port and /audit
                            headers: {
                                "jwt": jwt.sign(token, jwtSecret)
                            }
                        }, function (error, response, body) {
                            console.log('path 0');
                            let parseBody = JSON.parse(body);

                            console.log('path 3');
                            result[0].transaction.signature = parseBody.additionalData;
                            console.log('result: ', result);
                            resolve();
                            //**HERE
                        });
                    });
                });
                //**HERE

                return Promise.all(async_result);


            });  //end callback

            JSONPromise.then(() => {  //finalization  //**HERE
                respondWithJSON(200, req.body.result, req.body.description, res, result);
                console.log('end log/asset/audit');
            });
        });
});