对承诺感到困惑

时间:2018-04-26 11:55:46

标签: javascript jquery promise

我有以下代码,我无法理解为什么它不能做我想要的。作为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');
});

2 个答案:

答案 0 :(得分:2)

一旦定义了Promise,它可能会在可能的情况下开始运行。

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

您可以通过定义工厂函数来避免承诺之前运行,即只有在调用Promise时才构造Promise的函数。

答案 1 :(得分:1)

您的代码中有几处错误,

  1. 您正在解决和拒绝,要么解决也要拒绝。在这种情况下,永远不会调用reject。

  2. 你的担心是在没有代码的情况下调用.ready函数----你正在直接执行promises,就像它们正在执行那样。

  3. var f1 = new Promise(function(resolve, reject) {
      resolve(prn('1<br><br>'));
      reject('err');
    });
     这将在看到代码的那一刻立即执行。

    1. 承诺一旦解决或拒绝,他们的工作就完成了。他们无法再解决。因为它们已经被解决(你定义它们被解析的那一刻),即使你在加载函数中再次调用它们,它们也无法解决,而.load中的代码也没有输出任何东西。
    2. 要避免全部,请将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>'));
      });}