Javascript 如何在for循环中等待每个迭代,并在nodeJS中作为API响应返回响应
我使用for循环来迭代元素数组,并在for循环中使用不同的参数调用相同的函数。这是我的密码: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(
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;i
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
});
};