Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.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 对承诺感到困惑_Javascript_Jquery_Promise - Fatal编程技术网

Javascript 对承诺感到困惑

Javascript 对承诺感到困惑,javascript,jquery,promise,Javascript,Jquery,Promise,我有下面的代码,我不明白为什么它不能做我想要的。作为JS和jQuery的新手,我对以下几点感到困惑: 1) 即使我没有在ready()函数中编写任何代码,承诺也会运行。我是说,即使我不打电话,承诺也会兑现。 2) 此代码的目的是打印1、2,然后暂停3秒,打印3和打印结束。相反,它打印1,2,结束,然后在3秒钟后打印3 我在这里以及其他网站和博客上都找到了其他的例子,但作为JS的新手,我还没有理解它们。我做错了什么 $(document).ready(function (){ $.when(f

我有下面的代码,我不明白为什么它不能做我想要的。作为JS和jQuery的新手,我对以下几点感到困惑:

1) 即使我没有在ready()函数中编写任何代码,承诺也会运行。我是说,即使我不打电话,承诺也会兑现。 2) 此代码的目的是打印1、2,然后暂停3秒,打印3和打印结束。相反,它打印1,2,结束,然后在3秒钟后打印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');
});
$(文档).ready(函数(){
$.when(f1)
.然后(f2)
。然后(f3)
.然后(最终);
});
功能prn(texto){
$('p').append(texto);
}
var f1=新承诺(功能(解决、拒绝){
解析(prn('1

'); 拒绝(“错误”); }); var f2=新承诺(功能(解决、拒绝){ 解析(prn('2

'); 拒绝(“错误”); }); var f3=新承诺(功能(解决、拒绝){ setTimeout(函数(){ 解析(prn('3

'); 拒绝(“错误”); }, 3000); }); var final=新承诺(功能(解决、拒绝){ 解析(prn('END

'); 拒绝(“错误”); });
一旦定义了承诺,如果可能,它可能会开始运行

如果运行尚未结束,则等待;如果内部函数已结束,则返回
resolve
的值


您可以通过定义一个工厂函数(即仅在调用承诺时才会构造承诺的函数)来避免承诺提前运行。

代码中有几个错误

  • 您正在执行“解决”和“拒绝”,执行“解决”或“拒绝”。在这种情况下,从不调用reject

  • 您担心调用它时,甚至没有.ready函数中的代码——您直接执行承诺,就像它们在执行时和执行时一样

  • var f1=新承诺(函数(解析、拒绝){
    解析(prn('1

    '); 拒绝(“错误”);
    });将承诺分配给变量,这就是它运行的原因。您真正想要做的是创建一个返回承诺的函数。这个函数就是您需要调用的。在这种情况下,承诺在定义时会立即被解析和拒绝。请注意,它们是分配给变量的,而不是由它们生成的。您可能打算执行
    让f1=()=>新承诺…
    -即返回承诺对象而不是声明一个。
    即使我不调用承诺,承诺也会运行
    -您已经调用了它们。您创建了它们(
    newpromise
    ),并立即解析了它们(传递到
    newpromise
    的回调将立即被调用)。