我有以下代码,我无法理解为什么它不能做我想要的。作为JS和jQuery中的新手,我很困惑:
1)即使我没有在ready()函数内写任何代码,promises也会运行。我的意思是,即使我没有给他们打电话,承诺仍然有效。 2)此代码的目的是打印1,2,然后暂停3秒,打印3并打印END。相反,它打印1,2,END和三秒后,3。
我在这里和其他网站和博客上都找到了其他的例子,但作为JS的新手,我还没有理解它们。我做错了什么?
$(document).ready(function (){
$.when(f1)
.then(f2)
.then(f3)
.then(final);
});
function prn(texto) {
$('p').append(texto);
}
var f1 = new Promise(function(resolve, reject) {
resolve(prn('1<br><br>'));
reject('err');
});
var f2 = new Promise(function(resolve, reject) {
resolve(prn('2<br><br>'));
reject('err');
});
var f3 = new Promise(function(resolve, reject) {
setTimeout(function(){
resolve(prn('3<br><br>'));
reject('err');
}, 3000);
});
var final = new Promise(function(resolve, reject) {
resolve(prn('END<br><br>'));
reject('err');
});
答案 0 :(得分:2)
一旦定义了Promise,它可能会在可能的情况下开始运行。
如果运行尚未结束,则等待,或者如果内部函数已经结束,则返回resolve
的值。
您可以通过定义工厂函数来避免承诺之前运行,即只有在调用Promise时才构造Promise的函数。
答案 1 :(得分:1)
您的代码中有几处错误,
您正在解决和拒绝,要么解决也要拒绝。在这种情况下,永远不会调用reject。
你的担心是在没有代码的情况下调用.ready函数----你正在直接执行promises,就像它们正在执行那样。
var f1 = new Promise(function(resolve, reject) {
resolve(prn('1<br><br>'));
reject('err');
});
要避免全部,请将promises保留在函数中并在调用函数时返回它们 我把代码更改为在普通JS中运行...
var test = function (){
Promise.resolve().then(f1)
.then(f2)
.then(f3)
.then(final);
};
function prn(texto) {
console.log(texto);
}
var f1 = function(){ return new Promise(function(resolve, reject) {
resolve(prn('1<br><br>'));
})};
var f2 = function(){return new Promise(function(resolve, reject) {
resolve(prn('2<br><br>'));
});}
var f3 = function(){return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve(prn('3<br><br>'));
}, 3000);
});}
var final = function(){return new Promise(function(resolve, reject) {
resolve(prn('END<br><br>'));
});}