Promise findOneAsync variable = {“isFulfilled”:false,“isRejected”:false}?
使用蓝鸟Promisfymongoose,我有一个Promise.map(函数与一系列if / else循环通过一个数组,以查看引用文档是否存在,否则创build一个..
将findOneAsync的产品分配给一个variables,然后将“variable._id”分配给制作中的新文档(主承诺),控制台日志{"isFulfilled":false,"isRejected":false}
这是一个片段:
for (i=0; i<items.length; i++) { var existingItem = Models.Items.findOneAsync({ item: items[i] }); console.log( "existingItem : "); console.log( JSON.stringify(existingItem) ); console.log( "existingItem._id : " + existingItem._id );
这是一个日志:
existingItem : {"isFulfilled":false,"isRejected":false} existingItem._id : undefined
为什么可能为Model.Item.findOneAsync挂起existingItem
variables?
你的问题不是很清楚,但是我的问题是你为什么在检索它之后, 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.logs时,findOneAsync()还没有完成运行。
同样复杂的事情,它看起来像findOneAsync()
正在返回一个Promise(状态既没有履行,也没有被拒绝在你正在写日志)。
所以如果你想存储和loggingfind的项目,你需要
- 等待Promise使用它的
.then()
函数来解决 - (
findOneAsync()
应该将find的项目对象作为parameter passing给它的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 ); } }