承诺 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(在您写入日志时状态既未完成也未被拒绝)。

所以如果你想存储和记录找到的项目,你需要

  1. 等待 Promise 使用其 .then() 函数解析, 和
  2. 从 "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 操作完成之前登录。

您可以使用 thenawait 等待操作完成。

  • 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);