我已经阅读了有关某些文件的承诺以及我的一些基本问题,因为有一段时间我读到这是真的,有时却没有。
我有两个问题/澄清
一个例子非常有帮助
答案 0 :(得分:2)
- 如果Java脚本中的每个函数都可以使用promise进行调用(通过使用then),或者我应该从函数中返回一些promise对象,即通过向返回函数添加一些Q来对其进行不同的定义?
醇>
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.
});
ES中的Q.all或Promise.all是并行的,链接的承诺是顺序的:
- 我看到有链接承诺的选项,也可以做Q.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
});
- 有一些工具或某种方法可以验证承诺是否合适?因为当我尝试忘记某些链函数中的返回语句时可能会损害该过程。
醇>
是的,Spion刚刚为此编写了一个工具,它被称为thenlint
,您可以找到它here。描述说:
承诺的lint,用于检查可能的Promise.then使用错误。