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挂起existingItemvariables?

       

网上收集的解决方案 "Promise findOneAsync variable = {“isFulfilled”:false,“isRejected”:false}?"

你的问题不是很清楚,但是我的问题是你为什么在检索它之后, 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的项目,你需要

  1. 等待Promise使用它的.then()函数来解决
  2. 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 ); } }