关于Node.js承诺然后返回?

时间:2017-03-31 11:57:57

标签: javascript node.js promise

我对Promise感到困惑!

我使用承诺而不返回如下:

 <div class="col-md-10">
  <div class="carousel slide" data-ride="carousel">
    <div class="carousel-inner">
        <?php 
        $result_array = $this->db->get('vm_feedback')->result_array();
        foreach ($result_array as $key => $v) {?>
         <div class="item active">  
         <div class="col-md-12">
            <div class="testimonial-text">
                <p style="color:black;"><?php  echo $v['feed_desc'];?></p>
                <span class="testimonial-by"><?php echo $v['feed_name'];?></span>
            </div> 
         </div>
         </div>
        <?php   } ?>
    </div>
   </div>  
  </div>

我得到了这个结果 v1 v2 v11 。 然后,我使用另一种写作方式,如下所示:

new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1");
    new Promise((resolve, reject) => {
        //Time-consuming operation, for example: get data from database;
        setTimeout(() => {
            resolve(2)
        }, 3000);
    }).then((v11) => {
        console.log("v11");
    })
}).then((v2) => {
    console.log("v2")
});

我得到另一个结果 v1 v11 v2

也许,还有另一种情况:

 new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1");
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, 3000)
    }).then((v11) => {
        console.log("v11");
    })
}).then((v2) => {
    console.log("v2")
});

我得到的结果是 v1 v11 v12 v2

我无法理解第二次返回我想知道为什么会得到这个结果?

1 个答案:

答案 0 :(得分:3)

如果您实际打印已解析的promise的值而不仅仅是变量的名称,那么理解控制流会更容易:

版本1

new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1:", v1);
    new Promise((resolve, reject) => {
        //Time-consuming operation, for example: get data from database;
        setTimeout(() => {
            resolve(2)
        }, 3000);
    }).then((v11) => {
        console.log("v11:", v11);
    })
}).then((v2) => {
    console.log("v2:", v2)
});

第2版

new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1:", v1);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, 3000)
    }).then((v11) => {
        console.log("v11:", v11);
    })
}).then((v2) => {
    console.log("v2:", v2)
});

第3版

new Promise((resolve, reject) => {
resolve("1");
}).then((v1) => {
console.log("v1:", v1);
return new Promise((resolve, reject) => {
    setTimeout(() => {resolve(2)}, 3000)
}).then((v11) => {
    console.log("v11:", v11);
    return new Promise((resolve, reject) => {
        setTimeout(() => {resolve(2)}, 4000)
    }).then((v12) => {
        console.log("v12:", v12)
    })
})
}).then((v2) => {
console.log("v2:", v2)
});

现在您可以看到传递给回调的内容:

结果1

v1: 1
v2: undefined
v11: 2

结果2

v1: 1
v11: 2
v2: undefined

结果3

v1: 1
v11: 2
v12: 2
v2: undefined

说明

正如您在.then()处理程序中看到的那样,您没有返回一个承诺,它就好像您返回了一个已经解决的值为undefined的承诺 - 就像您执行了一样:

return Promise.resolve(undefined);

因此可以立即调用下一个.then()处理程序。

另一方面,如果您返回尚未解析的promise,则不会立即调用下一个.then()处理程序,但只有在返回的promise才能解析之后。

这解释了当你不返回一个承诺时执行的顺序不同 - 并且会发生什么,就好像已经解决的承诺被隐式返回给你。