Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在for循环中等待每个迭代,并在nodeJS中作为API响应返回响应_Javascript_Node.js_Asynchronous_Nodes_Node Modules - Fatal编程技术网

Javascript 如何在for循环中等待每个迭代,并在nodeJS中作为API响应返回响应

Javascript 如何在for循环中等待每个迭代,并在nodeJS中作为API响应返回响应,javascript,node.js,asynchronous,nodes,node-modules,Javascript,Node.js,Asynchronous,Nodes,Node Modules,我使用for循环来迭代元素数组,并在for循环中使用不同的参数调用相同的函数。这是我的密码: exports.listTopSongs = function(query) { return new Promise(function(resolve, reject) { var str = query.split(","), category, for(var i=0; i<str.length; i++) { sampleFn(

我使用for循环来迭代元素数组,并在for循环中使用不同的参数调用相同的函数。这是我的密码:

exports.listTopSongs = function(query) {
    return new Promise(function(resolve, reject) {
        var str = query.split(","), category,
        for(var i=0; i<str.length; i++) {
           sampleFn(str[i], 'sample', resolve, reject);
        }
    });
};

function sampleFn(lang, cat, resolve, reject) {
        client.on("error", function (err) {
            console.log(err);
            var err = new Error('Exception in redis client connection')
            reject(err);                                
        });
        client.keys(lang, function (err, keys){
            if (err) return console.log(err);
            if(keys.length != 0) {
                client.hgetall(keys, function (error, value) {
                    var objects = Object.keys(value);
                    result['title'] = lang;
                    result[cat] = [];
                    var x =0;
                    for(x; x<objects.length; x++) {
                        var val = objects[x];
                            User.findAll({attributes: ['X', 'Y', 'Z'],
                                where: {
                                    A: val
                                }
                            }).then(data => {
                                if(data != null) {
                                    //some actions with data and stored it seperately in a Json array
                                    if(result[cat].length == objects.length) {
                                        resolve(result);
                                    }
                                } else {
                                    console.log(""+cat+" is not avilable for this value "+data.dataValues['X']);
                                }
                            });
                    }
               });
         });
   }
在这里,它不会等待第一次迭代的完成。它只是在完成第一个迭代函数之前异步运行。我需要返回结果:[{1,2},{3,4}]。但它可以无缝运行,并在完成所有操作之前返回空对象或仅返回一个对象。如何解决

我使用了节点异步循环。但是它使用next,在使用该软件包时,我无法发送参数。请帮助我

提供了允许这样做的控制流方法

使用:


如果不想使用库,可以自己编写代码。这也会很有启发性。我解决了你的问题,编写了一个虚拟异步循环:

函数列表{ 返回新PromiseAncyResolve,拒绝=>{//add async here以执行异步调用 const str=query.split,//str是const,另外一个变量没有使用 对于let i=0;ir.json .thenrjson=>a+:+rjson.name }
ListTopSong1,2,3,4,5,6,7,8,9既然您使用的是承诺,那么您可以这样做

exports.listTopSongs = function(query) {
    return Promise.resolve(true).then(function(){
        var str = query.split(",");
        var promises = str.map(function(s){
            return sampleFn(str[i], 'sample');
        });
        return Promise.all(promises);
    }).then(function(results){
       //whatever you want to do with the result
    });
};

为此,您必须将sampleFn更改为不依赖外部解析和拒绝函数。我看不出使用外部解决和拒绝的理由。为什么不使用承诺。决心,承诺。拒绝

检查aync包。它有许多使for循环同步运行的函数。您使用的是哪个节点js版本?我使用的是节点8.4.0好的@ShubhamJain会尝试让您知道我无法将我的json数组从函数sampleFn返回到listTopSongs
exports.listTopSongs = function(query) {
    return Promise.resolve(true).then(function(){
        var str = query.split(",");
        var promises = str.map(function(s){
            return sampleFn(str[i], 'sample');
        });
        return Promise.all(promises);
    }).then(function(results){
       //whatever you want to do with the result
    });
};