我对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
我无法理解第二次返回我想知道为什么会得到这个结果?
答案 0 :(得分:3)
如果您实际打印已解析的promise的值而不仅仅是变量的名称,那么理解控制流会更容易:
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)
});
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)
});
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)
});
现在您可以看到传递给回调的内容:
v1: 1
v2: undefined
v11: 2
v1: 1
v11: 2
v2: undefined
v1: 1
v11: 2
v12: 2
v2: undefined
正如您在.then()
处理程序中看到的那样,您没有返回一个承诺,它就好像您返回了一个已经解决的值为undefined
的承诺 - 就像您执行了一样:
return Promise.resolve(undefined);
因此可以立即调用下一个.then()
处理程序。
另一方面,如果您返回尚未解析的promise,则不会立即调用下一个.then()
处理程序,但只有在返回的promise才能解析之后。
这解释了当你不返回一个承诺时执行的顺序不同 - 并且会发生什么,就好像已经解决的承诺被隐式返回给你。