Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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函数调用计时_Javascript_Arrays_Callback - Fatal编程技术网

javascript函数调用计时

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]

我试图实现一个for循环,该循环遍历一个列表并随后调用两个函数,只有在找到第一个函数的结果时

问题是第二个函数(search.similor)获取结果可能需要更长的时间

对于下面的代码,当我运行时,(search.locate)的所有适当输出都是正确的,但是(search.similor)函数只存储myList中最后一个元素的结果

例如,
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所发现的,将事情看作同步会让人陷入麻烦。但它肯定是单线程的,所以必须考虑用于长时间运行的回路等。