我正在尝试承诺,并有一个非常基本的问题!
在承诺链中,调用同步函数是不好的做法?例如:
.then(function(results) { if(checkIfResultInMemory(results) === true){ return getTotalFromMemory() } return results; })
或者我的同步函数是否应该重构以返回promises?
在承诺链中,调用同步函数是不好的做法?
不,这根本不是一个坏习惯.这是许多预期和有用的实践之一.
您可以完全自由地调用promise链中的同步函数(来自.then()
处理程序内)或异步函数,然后返回新的promise.
当您从.then()
处理程序返回某些内容时,您可以返回一个值(它成为父承诺的已解析值),或者您可以返回另一个承诺(链接到前一个承诺)或者您可以抛出哪些函数就像返回被拒绝的承诺一样(承诺链被拒绝).
因此,这意味着您可以调用同步函数并从中获取值或调用异步函数并获取另一个承诺,然后从.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; });
这是一个异步操作的小例子,它返回一个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);
});