Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise findOneAsync变量={IsCompleted:false,'isRejected:false}?_Javascript_Node.js_Mongoose_Promise_Bluebird - Fatal编程技术网

Javascript Promise findOneAsync变量={IsCompleted:false,'isRejected:false}?

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变量可能处于挂起状态?

利用Bluebird来提示Mongoose,我有一个Promise.map(带有一系列if/else的函数,用于在数组中循环以查看引用文档是否存在,否则创建一个)

将findOneAsync的产品分配给一个变量,然后将“variable.\u id”分配给正在生成的新文档(主要承诺),控制台记录
{“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
    。我们应该想象一下您的代码是什么样子吗?欣赏指针。这里是问题的症结所在:有没有比这更好的模式: