承诺 findOneAsync 变量 = {"isFulfilled":false,"isRejected":false}?
Promise findOneAsync variable = {"isFulfilled":false,"isRejected":false}?
利用 Bluebird 来 Promisfy Mongoose,我有一个 Promise.map( 带有一系列 if/else 的函数,用于遍历数组以查看是否存在参考文档,否则创建一个..
将 findOneAsync 的产品分配给一个变量,然后将 '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
为什么 existingItem
变量可能会等待 Model.Item.findOneAsync..?
你的问题不是很清楚,但我想问你的是:为什么 existingItem
不是 在你检索到它后立即挂起?
你了解如何使用 promises 吗?大多数时候,您需要使用 .then()
或其他 promise 操作函数来获取它们的解析值:
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(在您写入日志时状态既未完成也未被拒绝)。
所以如果你想存储和记录找到的项目,你需要
- 等待 Promise 使用其
.then()
函数解析,
和
- 从 "resolved value" 中检索找到的项目。
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 );
}
}
根本原因是,您没有等待直到操作完成。您正在 findOne
操作完成之前登录。
您可以使用 then
或 await
等待操作完成。
then
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.通过'awaiting'得到promise的最终状态如下:
var existingItem = await Models.Items.findOneAsync({ item: items[i] });
2。通过使用“.then”处理程序处理承诺,如下所示:
return Models.Items.findOneAsync({ item: items[i] })
.then(function(existingItem) {
console.log("existingItem", existingItem);
利用 Bluebird 来 Promisfy Mongoose,我有一个 Promise.map( 带有一系列 if/else 的函数,用于遍历数组以查看是否存在参考文档,否则创建一个..
将 findOneAsync 的产品分配给一个变量,然后将 '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
为什么 existingItem
变量可能会等待 Model.Item.findOneAsync..?
你的问题不是很清楚,但我想问你的是:为什么 existingItem
不是 在你检索到它后立即挂起?
你了解如何使用 promises 吗?大多数时候,您需要使用 .then()
或其他 promise 操作函数来获取它们的解析值:
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);
});
});
findOneAsync() 还没有完成 运行
同样使事情复杂化的是,看起来 findOneAsync()
正在返回一个 Promise(在您写入日志时状态既未完成也未被拒绝)。
所以如果你想存储和记录找到的项目,你需要
- 等待 Promise 使用其
.then()
函数解析, 和 - 从 "resolved value" 中检索找到的项目。
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 );
}
}
根本原因是,您没有等待直到操作完成。您正在 findOne
操作完成之前登录。
您可以使用 then
或 await
等待操作完成。
then
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.通过'awaiting'得到promise的最终状态如下:
var existingItem = await Models.Items.findOneAsync({ item: items[i] });
2。通过使用“.then”处理程序处理承诺,如下所示:
return Models.Items.findOneAsync({ item: items[i] })
.then(function(existingItem) {
console.log("existingItem", existingItem);