Javascript 节点js异步转换为同步

Javascript 节点js异步转换为同步,javascript,node.js,array-push,node-deasync,Javascript,Node.js,Array Push,Node Deasync,我需要将数据同步推送到阵列。第一个API请求get image key base,它需要在循环中获取图像数据 var deasync = require('deasync'); router.get('/a', function(req, res) { var username="user"; var passw ="pass"; var op = [];

我需要将数据同步推送到阵列。第一个API请求get image key base,它需要在循环中获取图像数据

 var deasync = require('deasync');


        router.get('/a', function(req, res) {
                var username="user";
                var passw ="pass";
                var op = [];
                var args = {
                    headers: {
                    'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64')
                }   
            };
         //this is first api request
        client.get(global.apiUrl+"V1/ProductItem", args,
        function (data, response) {
                //this is second api request
            data.forEach(function(img) {client.get(global.apiUrl+"V1/ImagePreview/"+img.AvatarKey,args,
                    function (data2, response){
                               img['data']=data2.Image;
                               deasync(pushData(img));
                          });
                    });     
                });

        function pushData(img){
            op.push(img);//array push 
        }
        res.render('test1', { "out":JSON.stringify(op) });
        });

尽管我认为
deasync
是解决特定问题的糟糕选择,但使用它的关键是“deasync”异步函数。由于Array.push是同步的,因此取消Array.push的同步没有任何意义

阅读了
deasync
的文档后,它的使用相当简单

var deasync = require('deasync');
// create a sync client.get
function syncClientGet(client, url, args) {
    var inflight = true;
    var ret;
    client.get(url, args, function(data, response) {
        // as your original code ignores response, ignore it here as well
        ret = data;
        inflight = false;
    });
    deasync.loopWhile(() => inflight);
    return ret;
}

router.get('/a', function(req, res) {
    var username = "user";
    var passw = "pass";
    var op = [];
    var args = {
        headers: {
            'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64')
        }
    };

    let data = syncClientGet(client, global.apiUrl + "V1/ProductItem", args);
    data.forEach(function(img) {
        let data2 = syncClientGet(client, global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args);
        img['data'] = data2.Image;
        op.push(img);
    });
    res.render('test1', {
        "out": JSON.stringify(op)
    });
});
但是,由于采用了异步性,您发布的代码可以轻松地编写为

router.get('/a', function (req, res) {
    var username = "user";
    var passw = "pass";
    var op = [];
    var args = {
        headers: {
            'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64')
        }
    };
    client.get(global.apiUrl + "V1/ProductItem", args, function (data, response) {
        data.forEach(function (img) {
            client.get(global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args, function (data2, response) {
                img['data'] = data2.Image;
                op.push(img);
                if (img.length == data.length) {
                    res.render('test1', {
                        "out": JSON.stringify(op)
                    });
                }
            });
        });
    });
});
或者,使用承诺

router.get('/a', function (req, res) {
    var username = "user";
    var passw = "pass";
    var args = {
        headers: {
            'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64')
        }
    };
    // create a Promisified client get
    var clientGetPromise = function clientGetPromise(client, url, args) {
        return new Promise(function (resolve, reject) {
            return client.get(url, args, function (data, response) {
                return resolve(data);
            });
        });
    };

    clientGetPromise(client, global.apiUrl + "V1/ProductItem", args).then(function (data) {
        return Promise.all(data.map(function (img) {
            return clientGetPromise(client, global.apiUrl + "V1/ImagePreview/" + img.AvatarKey, args).then(function (data2) {
                img['data'] = data2.Image;
                return img;
            });
        }));
    }).then(function (op) { // op is an Array of img because that's how Promise.all rolls
        return res.render('test1', { "out": JSON.stringify(op) });
    });
});

“我需要将数据同步推送到阵列”为什么?从技术上讲,添加到数组总是同步的,但我想你的意思是周围的一切都应该是同步的;PMinor语法更正。非常感谢。工作正常。我是node js的新手。感谢您的帮助