Javascript Promise findOneAsync变量={IsCompleted:false,'isRejected:false}?
利用Bluebird来提示Mongoose,我有一个Promise.map(带有一系列if/else的函数,用于在数组中循环以查看引用文档是否存在,否则创建一个) 将findOneAsync的产品分配给一个变量,然后将“variable.\u id”分配给正在生成的新文档(主要承诺),控制台记录Javascript Promise findOneAsync变量={IsCompleted:false,'isRejected:false}?,javascript,node.js,mongoose,promise,bluebird,Javascript,Node.js,Mongoose,Promise,Bluebird,利用Bluebird来提示Mongoose,我有一个Promise.map(带有一系列if/else的函数,用于在数组中循环以查看引用文档是否存在,否则创建一个) 将findOneAsync的产品分配给一个变量,然后将“variable.\u id”分配给正在生成的新文档(主要承诺),控制台记录{“iscompleted”:false,“isRejected”:false} 下面是一个片段: 为什么Model.Item.findOneAsync..的existingItem变量可能处于挂起状态?
{“iscompleted”:false,“isRejected”:false}
下面是一个片段:
为什么Model.Item.findOneAsync..的
existingItem
变量可能处于挂起状态?您的问题不是很清楚,但我想问您的问题是:为什么existingItem
在您检索它之后不会立即处于挂起状态
您了解如何使用承诺吗?大多数情况下,您需要使用。then()
或其他承诺操作函数获取其解析值:
var existingItem = Models.Items.findOneAsync({ item: items[i] });
existingItem.then(function (value) {
console.log( "existingItem : ");
console.log( JSON.stringify(existingItem) );
console.log( JSON.stringify(value); );
console.log( "existingItem._id : " + existingItem._id );
});
我想你想要:
return Promise.each(items, function(item) {
return Models.Items.findOneAsync({item: item}).then(function(existingItem) {
console.log("existingItem", existingItem);
});
});
当您开始编写console.log时,findOneAsync()还没有完成运行
同样使事情复杂化的是,它看起来像是findOneAsync()
正在返回一个承诺(在您编写日志时,状态既没有实现也没有被拒绝)
因此,如果要存储和记录找到的项目,需要
功能解决。然后(),
及
findOneAsync()
应将找到的项对象作为参数传递给其
resolve()
函数(即findOneAsync()
中的某个地方将有:resolve(foundItem);
) for (i=0; i<items.length; i++) {
var findPromise = Models.Items.findOneAsync({ item: items[i] });
//the next line won't run until findOneAsync finishes
findPromise.then(resolveResult => {
var existingItem = resolveResult;
console.log( "existingItem : ");
console.log( JSON.stringify(existingItem) );
console.log( "existingItem._id : " + existingItem._id );
}
}
for(i=0;i根本原因是,您的没有等待操作完成。您是在findOne
操作完成之前登录的
您可以使用then
或wait
等待操作完成
然后
Item.findOne({ where: { id: your_id } })
.then(result => console.log(result))
await
函数必须以async
键作为前缀,但此代码要干净得多
const result = await Item.findOne({ where: { id: your_id } })
console.log(result)
您需要等待承诺得到解决(或拒绝)。
您可以使用以下两种方式之一:
1.通过“等待”获得承诺的最终状态,如下所示:
var existingItem = await Models.Items.findOneAsync({ item: items[i] });
return Models.Items.findOneAsync({ item: items[i] })
.then(function(existingItem) {
console.log("existingItem", existingItem);
2.使用“.then”处理程序处理承诺,如下所示:
var existingItem = await Models.Items.findOneAsync({ item: items[i] });
return Models.Items.findOneAsync({ item: items[i] })
.then(function(existingItem) {
console.log("existingItem", existingItem);
我看不到您为变量赋值。\u id
。我们应该想象一下您的代码是什么样子吗?欣赏指针。这里是问题的症结所在:有没有比这更好的模式: