ES6 Promises-在Promise链中调用同步函数

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

在一个Promise链中,调用同步函数是否是错误的做法?例如:

.then(function(results) {

if(checkIfResultInMemory(results) === true){

return getTotalFromMemory()

}

return results;

})

还是应该将我的同步功能重构为也返回承诺?

回答:

在一个Promise链中,调用同步函数是否是错误的做法?

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

您可以完全自由地(在.then()处理程序中)调用promise链中的同步函数或异步函数,然后再返回新的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);

});

注意:通常,您仅在有或可能有异步操作时才希望使用Promise,因为如果一切都是同步的,那么纯同步代码既执行起来更快,编写起来也更容易。但是,如果您已经至少有一个异步操作,则可以将同步操作与该异步操作混合使用,并使用诺言来帮助构建代码。

以上是 ES6 Promises-在Promise链中调用同步函数 的全部内容, 来源链接: utcz.com/qa/407698.html

回到顶部