ES6 Promises-在Promise链中调用同步函数
我目前正在尝试诺言,并且有一个非常基本的问题!
在一个Promise链中,调用同步函数是否是错误的做法?例如:
.then(function(results) { if(checkIfResultInMemory(results) === true){
return getTotalFromMemory()
}
return results;
})
还是应该将我的同步功能重构为也返回承诺?
回答:
在一个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 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;
});
这是一个异步操作的小示例,该操作返回一个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,因为如果一切都是同步的,那么纯同步代码既执行起来更快,编写起来也更容易。但是,如果您已经至少有一个异步操作,则可以将同步操作与该异步操作混合使用,并使用诺言来帮助构建代码。
以上是 ES6 Promises-在Promise链中调用同步函数 的全部内容, 来源链接: utcz.com/qa/407698.html