我目前正在尝试诺言,并且有一个非常基本的问题!
在一个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,因为如果一切都是同步的,那么纯同步代码既执行起来更快,编写起来也更容易。但是,如果您已经至少有一个异步操作,则可以将同步操作与该异步操作混合使用,并使用诺言来帮助构建代码。
我正在使用Q promise库的Node.js应用程序中工作。我有两组promise链,一个用于控制流,另一个用于调用服务方法,我从中检索数据,我的问题是,我需要获取promise链对另一个promise链的返回值。 MyExample.js 在上面的代码中,我调用bookService.getBookById(bookId)并获取书籍。然后我调用bookDetals函数,它是一个promise链
问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调
问题内容: 更新: 为了帮助以后的读者,我创建 了pluma’s answer的演示 。 题: 我的目标似乎很简单。 这里的问题是,如果我在步骤1上失败,则两个AND都会被触发。如果我不那么就不会被解雇,但会,我明白了。除了我想做的以外,我已经完成了所有工作。 如何编写promise,以便我可以在拒绝时调用函数,而无需调用错误链中的所有函数?还是有另一种方法可以做到这一点? 这是一个现场演示, 因
我正在使用编写promise代码。然后现在,我决定使用wait/async编写它。我在promise中调用了一个函数add_,然后在中调用了另一个函数。然后是该函数的一部分。这是我使用的代码。然后 这是使用wait/async的代码。 使用await/async的代码显示了一个错误,即add\u lessons是意外标识符。那么,告诉我如何在promise中定义异步函数?
链式调用异步函数。 循环遍历包含异步事件的函数数组,每次异步事件完成后调用 next 。 const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; chainAsync([ next => { console.log('0 seconds');