ES6 Promises - 在承诺链中调用同步函数
ES6 Promises - Calling synchronous functions within promise chain
我目前正在试验 promises 并且有一个非常基本的问题!
在 promise 链中,调用同步函数是否是一种不好的做法?例如:
.then(function(results) {
if(checkIfResultInMemory(results) === true){
return getTotalFromMemory()
}
return results;
})
或者我的同步函数是否也应该重构为 return promises?
Within a promise chain, would it be bad practice to call a synchronous
function?
不,这根本不是一个坏习惯。这是许多预期和有用的做法之一。
您可以完全自由地调用 promise 链中的同步函数(从 .then()
处理程序中)或异步函数然后 return 一个新的 promise。
当你 return 来自 .then()
处理程序的东西时,你可以 return 一个值(它成为父承诺的解析值)或者你可以 return 另一个 promise(链接到之前的 promise)或者你可以 throw 像 returning 一个被拒绝的 promise(promise 链被拒绝)。
因此,这意味着您可以调用同步函数并从中获取值,或者调用异步函数并获取另一个 promise,然后 return 来自 .then()
处理程序。
所有这些同步事物都是完全合法的,并且每个都有自己的 objective。以下是 .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;
});
这是一个异步操作的小例子,return 一个 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);
});
注意:您通常只希望在有或可能有异步操作时使用 promises,因为如果一切都是同步的,那么纯同步代码执行起来会更快,也更容易编写。但是,如果您已经有至少一个异步操作,您当然可以将同步操作与该异步操作混合使用,并使用 promises 来帮助构建代码。
一个then
回调函数应该:
- return另一个承诺
- return 同步值(或未定义)
- 抛出一个同步错误
我目前正在试验 promises 并且有一个非常基本的问题!
在 promise 链中,调用同步函数是否是一种不好的做法?例如:
.then(function(results) {
if(checkIfResultInMemory(results) === true){
return getTotalFromMemory()
}
return results;
})
或者我的同步函数是否也应该重构为 return promises?
Within a promise chain, would it be bad practice to call a synchronous function?
不,这根本不是一个坏习惯。这是许多预期和有用的做法之一。
您可以完全自由地调用 promise 链中的同步函数(从 .then()
处理程序中)或异步函数然后 return 一个新的 promise。
当你 return 来自 .then()
处理程序的东西时,你可以 return 一个值(它成为父承诺的解析值)或者你可以 return 另一个 promise(链接到之前的 promise)或者你可以 throw 像 returning 一个被拒绝的 promise(promise 链被拒绝)。
因此,这意味着您可以调用同步函数并从中获取值,或者调用异步函数并获取另一个 promise,然后 return 来自 .then()
处理程序。
所有这些同步事物都是完全合法的,并且每个都有自己的 objective。以下是 .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;
});
这是一个异步操作的小例子,return 一个 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);
});
注意:您通常只希望在有或可能有异步操作时使用 promises,因为如果一切都是同步的,那么纯同步代码执行起来会更快,也更容易编写。但是,如果您已经有至少一个异步操作,您当然可以将同步操作与该异步操作混合使用,并使用 promises 来帮助构建代码。
一个then
回调函数应该:
- return另一个承诺
- return 同步值(或未定义)
- 抛出一个同步错误