Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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_Promise - Fatal编程技术网

javascript承诺所有作为参数传递的值数组

javascript承诺所有作为参数传递的值数组,javascript,arrays,callback,promise,Javascript,Arrays,Callback,Promise,给定以下值数组: var sportList = ['football', 'volleyball']; 我想使用以下每个值在mongo数据库上运行查询: function myFunc(sport, callback) { mongoDB.sports.find({'name': sport}, function (error, result) { if (error) { callback(error) } else { callback

给定以下值数组:

var sportList = ['football', 'volleyball'];
我想使用以下每个值在mongo数据库上运行查询:

function myFunc(sport, callback) {
  mongoDB.sports.find({'name': sport}, function (error, result) {
    if (error) {
        callback(error)
    } else {
        callback(null, result)
    }
  })
}
因此,我做出如下承诺:

var promises = sportList.map(function(val){
    return myFunc(val);
});
然后尝试在承诺-所有链中运行所有:

Promise.all(promises)
        .then(function (result) {
            console.log('log results: ', result);
        })
        .catch(function (error) {
            console.log(error);
        });

但是这不起作用,因为它抱怨
回调
未定义,我如何才能正确地修复它?

错误的原因是您调用
myFunc
方法时没有提供
回调
参数

一个解决方案是用以下函数替换
myFunc
函数。此函数将返回一个新的
承诺
。我还没有测试下面的代码,但它应该可以工作

function myFunc(sport) {
  return new Promise((resolve, reject) => {
    mongoDB.sports.find({'name': sport}, function (error, result) {
      if (error) {
          reject(error);
      } else {
          resolve(result);
      }
    })
  }));
}

为了使用
Promise.all
,您实际上应该有一系列承诺
myFunc
不返回任何内容,因此目前您有一个
未定义的
值数组。您必须让它返回一个承诺。
回调
未定义-您没有向它传递值。您期望发生什么?另外,如果您提供回调,承诺将是一个未定义的
数组。。。所有理想情况下都应该提供一系列承诺
myFunc
与Promisestry将myFunc更改为
const myFunc=sport=>newpromise((解析,拒绝)=>mongoDB.sports.find({'name':sport},(error,result)=>error?reject(error):resolve(result))或者,如果使用最新的nodejs(我在这里假设nodejs)。。。在代码中添加
const myFuncAsync=utils.promisify(myFunc)
,并使用
var promises=sportList.map(myFuncAsync)