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)