代码之家  ›  专栏  ›  技术社区  ›  Shivam Dhawan

使用Promise同步函数调用

  •  0
  • Shivam Dhawan  · 技术社区  · 7 年前

    我正在尝试同步函数调用,但不想使用回调。我对这件事还是很陌生,所以请给我一点解释

    var h1 = $('#title>h1');
    $(window).ready(function(){
      var s1 = "WELCOME.";
      var s2= "Projects";
    
      print(0,s1);
      print(0,s2);
    });
    
    function print(i,st){
      setTimeout(function(){
        h1.text(st.substr(0,i));
        if(i<8){
          print(i+1,st);
        }
      },250);
    }
    

    我在这里尝试过使用Promise: How should I call 3 functions in order to execute them one after the other? 但没有成功。它给出了一个错误 后果 找不到,我真的搞不清楚。

    var h1 = $('#title>h1');
    $(window).ready(function(){
      var s1 = "WELCOME.";
      var s2= "Projects";
    
      new Promise(function(fulfill,reject){
        print(0,s1);
        fulfill(result);
      }).then(function(result){
        print(0,s2);
      });
    
    });
    

    这是我从stackoverflow问题中得到的结果,我得到的错误是:

        Uncaught (in promise) ReferenceError: result is not defined
            at projects.js:8
            at new Promise ()
            at HTMLDocument. (projects.js:6)
            at j (jquery-3.2.1.min.js:2)
            at k (jquery-3.2.1.min.js:2)
    

    代码笔: https://codepen.io/anon/pen/QaBYQz
    2 回复  |  直到 7 年前
        1
  •  1
  •   I wrestled a bear once.    7 年前

    var h1 = $('#title>h1');
    $(window).ready(function() {
      var s1 = "WELCOME.";
      var s2 = "Projects";
      print(0, s1).then(()=>print(0, s2));;
    });
    
    function print(i, st, p) {
      return new Promise(done => {
        p = p || done;
        if(i > st.length) return p();
        setTimeout(function() {
          h1.text(st.substr(0, i));
          print(i + 1, st, p);
        }, 250);
      });
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id=title>
      <h1></h1>
    </div>

    您需要解决呼叫时创建的第一个承诺 print 这是第一次。当你打电话的时候 打印 递归地,你在创造新的承诺,所以如果你只是打电话 done 当最后一封信打印出来时,你只会做出最后的承诺。因此,我创建了一个新参数,函数可以使用该参数递归地传递第一个承诺 完成 履行过去的承诺。

    第一次调用函数时, p 未定义,使用 p = p || done; 我们正在分配 p 完成 只有 如果 p 未定义。所以当整个单词打印出来时(即, i > st.length ) p 还是第一个 完成 作用通过调用 return p(); 我们解析第一个函数并结束执行。

        2
  •  0
  •   Faly    7 年前

    您可以重写它以使用承诺:

    var h1 = $('#title>h1');
    
    function onReady() {
      return new Promise(function(resolve) {
        $(window).ready(function(){
          var s1 = "WELCOME.";
          var s2= "Projects";
          resolve([s1, s2]);
        });
      });
    }
    
    onReady().then(function(res) {
      print(0, res[0]);
      print(0, res[1]);
    });
    
    
    function print(i,st){
      setTimeout(function(){
        h1.text(st.substr(0,i));
        if(i<8){
          print(i+1,st);
        }
      },250);
    }