JS承诺/异步澄清问题

时间:2014-11-12 09:10:49

标签: javascript jquery angularjs promise angular-promise

我已经阅读了有关某些文件的承诺以及我的一些基本问题,因为有一段时间我读到这是真的,有时却没有。

我有两个问题/澄清

  1. 如果Java脚本中的每个函数都可以使用promise进行调用(通过使用then),或者我应该从函数中返回一些promise对象,即通过向返回函数添加一些Q来对其进行不同的定义?
  2. 我看到有链接承诺的选项,也可以做Q.all它们之间有什么不同
  3. 一个例子非常有帮助

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果Java脚本中的每个函数都可以使用promise进行调用(通过使用then),或者我应该从函数中返回一些promise对象,即通过向返回函数添加一些Q来对其进行不同的定义?
  2.   

Promises使用返回值。如果一个函数没有返回一个承诺 - 将它链接到另一个承诺将不会等待任何事情。链(或像.all之类的聚合)知道函数何时完成的方式是使用返回值。

function fn1(){
    setTimeout(function(){ console.log("Hi"); }, 1000);
}
Promise.resolve.then(function(){ // start empty ES6 promise chain
    return fn1();
}).then(function(){
    console.log("Bye"); // this will log "Bye Hi" because it did not wait.
});

正确的方法是promisify it

function fn2(){ // in Angular which you tagged, this is similar to `$timeout`
    return new Promise(function(resolve, reject){
        setTimeout(function(){ console.log("Hi"); resolve(); }, 1000);
    });
}
Promise.resolve.then(function(){ // start empty ES6 promise chain
    return fn2();
}).then(function(){
    console.log("Bye"); // this will log "Bye Hi" because it did not wait.
});
  
      
  1. 我看到有链接承诺的选项,也可以做Q.all它们之间有什么不同
  2.   
ES中的Q.all或Promise.all是并行的,链接的承诺是顺序的:

Promise.all([fn1(), fn2(), fn3]).then(function(){
    // fn1 fn2 and fn3 complete at an arbitrary order
    // code here executes when all three are done
});

fn1().then(fn2).then(fn3).then(function(){
   // fn1 executes, when it is done fn2, when it is done fn3,
   // then code here
});
  
      
  1. 有一些工具或某种方法可以验证承诺是否合适?因为当我尝试忘记某些链函数中的返回语句时可能会损害该过程。
  2.   

是的,Spion刚刚为此编写了一个工具,它被称为thenlint,您可以找到它here。描述说:

  

承诺的lint,用于检查可能的Promise.then使用错误。