Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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_Node.js_Promise - Fatal编程技术网

Javascript 如何像同步方法一样调用异步方法?

Javascript 如何像同步方法一样调用异步方法?,javascript,node.js,promise,Javascript,Node.js,Promise,我将node.js和mongoDB与promissions.js一起使用。我必须在promise变量中调用一个异步方法,但我不能使用另一个。因为它在循环中。代码如下: collection1.find({'key': 'value'}) .then(function(matches){ //loop starts matches.forEach(function(match){

我将node.js和mongoDB与promissions.js一起使用。我必须在promise变量中调用一个异步方法,但我不能使用另一个。因为它在循环中。代码如下:

collection1.find({'key': 'value'})
            .then(function(matches){
               //loop starts
                matches.forEach(function(match){
                    var currentUser = collection2.find({"_id" : match._user})
                    console.log(currentUser); //undefined
                })
}) 
如您所见,currentUser是一个未定义的变量。我如何解决这个问题?

您可以使用

异步也可以工作:

function processMatch(match, cb) {
  collection2.findOne({"_id":match._user}).then(function(user) {
    cb(null, user);
  });
}
collection1.find({'key':'value'})
  .then(function(matches) {
    var async = require('async');
    async.mapLimit(results.results, NUMBER_OF_PARALLEL_REQUEST, processMatch, function(err, users) {
      users.forEach(function(currentUser) {
      });
    });
  }); 

currentUser不应该是一个承诺吗?另外,收集一个您想要提取的id列表,并在一次行程中提取所有id不是更好吗?这将巧合地解决您的问题,并提高性能。您需要将日志放入。然后从内部查找中删除,循环没有理由排除承诺的使用……如果你想在整体问题上得到帮助,你需要描述整体问题,包括你的循环和你在循环中试图实现的目标。有很多不同的方法来处理异步操作序列,这些操作传统上可能在循环中完成,但是如何最好地处理它们取决于对整个问题的描述。根据您的标题,答案是您不能像调用sync方法那样调用异步方法。您必须调整所使用的工具和编程方法。相反,该怎么做,需要更多地描述你的问题。习惯上用评论来证明反对投票是正当的,这样答案就可以得到改善……从什么时候开始习惯上证明投票是正当的?通过评论提供反馈是一种习惯,但这与投票无关。用有益或有益的方式代替习惯polite@KevinB-对否决票不加任何评论,就好比让一个孩子暂停,而不告诉他们为什么要受到惩罚。它不太可能影响未来的行为,这是负面反馈的一个重要方面。相反,这只会让每个人都发疯,而且没有真正取得多大成就。因此,stack overflow的好公民在投反对票时选择教书,这样接受者就可以学习,社区也会受益。我从来没有看到过不能用1-2个有针对性的句子来描述的否决票。我不是有意要说些什么,只是感到困惑,想要改进。。。即使是Stackoverflow也会在单击向下箭头时提示@丹达维斯表示同意