javascript函数调用计时
我试图实现一个for循环,该循环遍历一个列表并随后调用两个函数,只有在找到第一个函数的结果时 问题是第二个函数(search.similor)获取结果可能需要更长的时间 对于下面的代码,当我运行时,(search.locate)的所有适当输出都是正确的,但是(search.similor)函数只存储myList中最后一个元素的结果 例如,javascript函数调用计时,javascript,arrays,callback,Javascript,Arrays,Callback,我试图实现一个for循环,该循环遍历一个列表并随后调用两个函数,只有在找到第一个函数的结果时 问题是第二个函数(search.similor)获取结果可能需要更长的时间 对于下面的代码,当我运行时,(search.locate)的所有适当输出都是正确的,但是(search.similor)函数只存储myList中最后一个元素的结果 例如,all_results=[[cat_res1,mouse_res2],[dog_res1,mouse_res2],[mouse_res1,mouse_res2]
all_results=[[cat_res1,mouse_res2],[dog_res1,mouse_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]);
}
});
}
如何修复此问题以按正确的顺序附加正确的结果
例如,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]);
}
});
}
var search=require('./search');
var myList=['cat','dog','mouse'];
var all_结果=[];
对于(i=0;iJavascript可以被认为是异步的,因为特定函数的执行不一定是同步的,但是“将Javascript描述为异步可能会产生误导。更准确的说法是,Javascript是同步的,具有各种回调机制的单线程”
为了实现您的目标,尽管top数组可能仍存在一些排序问题,但您需要将.similor()
调用封装到另一个同时使用这两个参数的函数中。您在top搜索中对“项”的引用正在更改:
function searchNestedSimilar(item, topRes) {
search.similar(item, function (err, similarResult) {
if (err){
return;
}
if (!topRes){
return;
}
var res1 = topRes.data
var res2 = similarResult.data
// append results to array
all_results.push([res1,res2])
}
}
function searchLocate(item) {
search.locate(item, function (err, searchResult) {
if (err){
console.log("Error");
return;
}
if (!searchResult){
console.log("Cannot find it");
return;
}
searchNestedSimilar(item, searchResults);
}
我封装了这两个调用以使其模块化,但由于“item”在闭包中,因此您实际上只需要searchLocate()
函数在迭代过程中包装捕获您的item引用。这是一个很好的承诺案例(例如,请参阅Bluebird JS),或者您可以使用
async.map()
这一页也很好地讨论了这一点
也有许多堆栈溢出讨论承诺
这是一个如何写下承诺的粗略示例:
var search = require('./search');
var myList = ['cat','dog','mouse']
var all_results = []
var Promise = require('bluebird');
var locate = Promise.promisify(search.locate);
var similar = Promise.promisify(search.similar);
for (i = 0; i < myList.length; i++){
// locate function
locate(myList[i], function (err, searchResult) {
if (err) {
console.log("Error");
return;
}
if (!searchResult){
console.log("Cannot find it");
return;
}
}).then(function(result) {
//similarity function
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])
}).finally(function() {
// NOP
});
});
}
var search=require('./search');
var myList=['cat','dog','mouse']
var all_结果=[]
风险值承诺=要求(“蓝鸟”);
var locate=promisify.promisify(search.locate);
var相似=promisify.promisify(search.simular);
对于(i=0;i
search.locate和search.similor返回什么类型的值?这些方法是异步的吗?不要使用push
,而是分配给存储在变量中的相应索引。@RobG让我们假设它们将是一些kind@Bergi,你的意思是这样>所有结果[i]=[res1,res2]如果它们是对象,则您可能正在为同一对象分配引用。但是(从其他注释中)调用可能是异步的,并且闭包正在影响结果。是的,此代码仍然存在问题要求解决的顺序问题。不确定“顶部搜索中的引用”是什么意思?“Javascript是异步的”——不是一般的。唉,这是真的,问题仍然存在。两个异步调用都需要包装为myList[i]也不是参数化的。我已经修复了我的示例。@RobG我仍然认为它是aynchronous的-因为在浏览器中,事件会被触发,而在node.js中仍然有一个事件循环。正如chattrat423所发现的,将事情看作同步会让人陷入麻烦。但它肯定是单线程的,所以必须考虑用于长时间运行的回路等。