ES6承诺 – 在承诺链中调用同步function

我目前正在尝试承诺,并有一个非常基本的问题!

在承诺链中,调用同步函数是不好的做法吗? 例如:

.then(function(results) { if(checkIfResultInMemory(results) === true){ return getTotalFromMemory() } return results; }) 

还是应该我的同步function重构承诺还呢?

       

网上收集的解决方案 "ES6承诺 – 在承诺链中调用同步function"

在承诺链中,调用同步函数是不好的做法吗?

不,这根本不是一个坏习惯。 这是许多预期和有用的做法之一。

您可以完全自由地调用promise链中的同步函数(来自.then()处理程序)或asynchronous函数,然后返回新的promise。

当你从.then()处理程序返回一些东西时,你可以返回一个值(它成为父承诺的parsing值),或者你可以返回另一个promise(链接到前面的promise),或者你可以抛出返回被拒绝的承诺(承诺链被拒绝)。

所以,这意味着你可以调用一个同步函数并从中获取一个值,或者调用一个asynchronous函数并获得另一个promise,然后从.then()处理程序返回。

所有这些同步的东西都是完全合法的,每个都有自己的目标。 以下是.then()处理程序中的一些同步事件:

 // modify resolved value someAsync().then(function(val) { return val + 12; }); // modify resolved value by calling some synchronous function to process it someAsync().then(function(val) { return someSynchronousFunction(val); }); // synchronously check the value and throw to change the promise chain // to rejected someAsync().then(function(val) { if (val < 0) { throw new Error("value can't be less than zero"); } return val; }); // synchronously check the value and return a rejected promise // to change the promise chain to rejected someAsync().then(function(val) { if (val < 0) { return Promise.reject("value can't be less than zero"); } return val; }); 

下面是一个asynchronous操作的例子,它返回一个承诺,然后是三个同步的.then()处理程序,然后输出最终的值:

 function delay(t, val) { return new Promise(function(resolve) { setTimeout(function() { resolve(val); }, t); }); } function increment5(val) { return val + 5; } delay(500, 10).then(increment5).then(function(val) { return val - 3; }).then(function(final) { document.write(final); }); 

thencallback函数应该:

  • 返回另一个诺言
  • 返回一个同步值(或未定义)
  • 抛出同步错误