【发布时间】:2017-03-28 23:02:14
【问题描述】:
我正在尝试实现一个 for 循环,该循环遍历一个列表并随后调用两个函数,前提是找到第一个函数结果。
问题在于第二个函数(search.similar)可能需要更长的时间来获取结果。
使用下面的代码,当我运行时,来自 (search.locate) 的所有适当输出都是正确的,但只有来自 myList 的最后一个元素的结果从 (search.similar) 函数存储。
即。 all_results = [[cat_res1,mouse_res2],[dog_res1,mouse_res2],[mouse_res1,mouse_res2]]
如何解决这个问题,以正确的顺序附加正确的结果?
即。 all_results = [[cat_res1,cat_res2],[dog_res1,dog_res2],[mouse_res1,mouse_res2]]
var search = require('./search');
var myList = ['cat','dog','mouse'];
var all_results = [];
for (i=0; i<myList.length; i++){
/* locate function*/
search.locate(myList[i], function (err, searchResult){
if (err){
console.log("Error");
return;
}
if (!searchResult){
console.log("Cannot find it");
return;
}
/*similarity function*/
/* seems to take longer*/
search.similar(myList[i], function (err, similarResult){
if (err){
return;
}
if (!similarResult){
return;
}
var res1 = searchResult.data;
var res2 = similarResult.data;
/* append results to array*/
all_results.push([res1,res2]);
}
});
}
【问题讨论】:
-
search.locate 和 search.similar 返回什么类型的值?这些方法是异步的吗?
-
不要使用
push,而是分配给您存储在properly scoped 变量中的相应索引。 -
@RobG 假设它们是某种对象
-
@Bergi,你的意思是这样的 > all_results[i] = [res1,res2]
-
如果它们是对象,那么您可能会将引用分配给同一个对象。但看起来(来自其他 cmets)调用可能是异步的,并且闭包会影响结果。
标签: javascript arrays callback