在一个Promise链中,调用同步函数是否是错误的做法?
不,这根本不是一个坏习惯。这是许多预期和有用的实践之一。
您可以完全自由地(在
.then()处理程序中)调用promise链中的同步函数或异步函数,然后再返回新的promise。
当您从
.then()处理程序中返回某些内容时,您可以返回一个值(它将成为父承诺的已解决值),也可以返回另一个承诺(将其链接到前一个承诺上),也可以抛出类似于返回被拒绝的承诺的工作(承诺链被拒绝)。
因此,这意味着您可以调用同步函数并从中获取值,或者调用异步函数并获得另一个诺言,然后从
.then()处理程序中返回。
所有这些同步事物都是完全合法的,并且每个都有其自己的目标。这是
.then()处理程序中的一些同步事件:
// modify resolved valuesomeAsync().then(function(val) { return val + 12;});// modify resolved value by calling some synchronous function to process itsomeAsync().then(function(val) { return someSynchronousFunction(val);});// synchronously check the value and throw to change the promise chain// to rejectedsomeAsync().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 rejectedsomeAsync().then(function(val) { if (val < 0) { return Promise.reject("value can't be less than zero"); } return val;});这是一个异步操作的小示例,该操作返回一个promise,之后是三个同步
.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);});注意:通常,您仅在有或可能有异步操作时才希望使用Promise,因为如果一切都是同步的,那么纯同步代码既执行起来更快,编写起来也更容易。但是,如果您已经至少有一个异步操作,则可以将同步操作与该异步操作混合使用,并使用诺言来帮助构建代码。



