gpt4 book ai didi

node.js - Bluebird 警告 : a promise was created in a handler but was not returned from it

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:38 25 4
gpt4 key购买 nike

我有一个文件名数组,我使用 Node 的异步模块对其进行迭代。

       async.eachSeries(imageStore, function(imageDetails,callback){
mongoMan.updateCollection('imageStore',imageDetails,{_id: imageDetails.fileName}).then(function(res){
return callback(null, res);
}).catch(function(err){
logger.error(err);
return callback(err);
});
},function(err){
callback(null);
});

updateCollection() 函数如下:

exports.updateCollection = function(collection, values, condArr){

var result = imageStores.updateAsync(condArr, values, { upsert: true }).then(function(res){
return new Promise.resolve(res);
}).catch(function(err){
logger.error(err);
});

return new Promise.resolve(result);
}

这段代码运行良好,更新了数据库和所有内容。但我仍然无法解决 Bluebird 抛出的警告:

Warning: a promise was created in a handler but was not returned from it
at Object.exports.updateCollection (/home/swateek/Documents/codebase/poc/apps/webapp/server/components/mongodb/mongoConn.js:46:22)
at /home/swateek/Documents/codebase/poc/apps/webapp/server/components/imageStore.js:72:24
at /home/swateek/Documents/codebase/poc/apps/webapp/node_modules/async/lib/async.js:181:20
at iterate (/home/swateek/Documents/codebase/poc/apps/webapp/node_modules/async/lib/async.js:262:13)

已查找解决方案here但这对我来说还不够有说服力。至少有办法关闭警告吗?

更新

请检查下面的正确答案,这是我的调用函数的样子:

function(callback){// post imageStore data to DB
async.eachSeries(imageStore, function(imageDetails,callback){
mongoMan.updateCollection('imageStore',imageDetails,{_id: imageDetails.fileName}).catch(function(err){
logger.error(err);
return callback(err);
});
return callback(null);
},function(err){
callback(null);
});
}

最佳答案

如果您尝试将异步库回调与 Promise 混合在一起,那么您就是在自找麻烦并放弃编程优势。选择一种结构并在任何地方使用它。就我个人而言,我建议您转向 promise 并仅“ promise ”当前与回调一起使用的函数。如果您使用的是 Bluebird Promise 库,那么它具有 Promise.promisify()Promise.promisifyAll(),这使得 Promise 使用标准的东西变得非常容易node.js 异步回调,因此您可以使用 Promise 逻辑控制一切。

现在,谈谈您的具体问题。该错误意味着您正在 .then() 处理程序中创建 Promise,但这些 Promise 不会返回或链接到任何先前的 Promise。因此,它们完全独立于您的其他链。这通常是一个错误(因此是警告的原因)。人们真正想要这样做的唯一一次可能是您有一些即发即忘操作,您不希望外部 promise 等待,并且您没有跟踪错误,而这些错误不是您在这里所拥有的。

更改为:

exports.updateCollection = function(collection, values, condArr){
return imageStores.updateAsync(condArr, values, { upsert: true}).catch(function(err){
logger.error(err);
// rethrow error so the caller will see the rejection
throw err;
});
}

变化:

  1. 返回主要 Promise,而不是创建新 Promise。
  2. 不需要 return new Promise.resolve(res); 因为 res 已经从该 Promise 返回,因此您可以删除整个 .then() 处理程序,因为它没有执行任何操作。
  3. 无需return new Promise.resolve(result);,因为您可以直接返回之前的 Promise。

仅供引用,尽管您在这里根本不需要它,但可以直接调用 Promise.resolve() 而无需 new

关于node.js - Bluebird 警告 : a promise was created in a handler but was not returned from it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36923282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com