当前位置: 首页 > 面试题库 >

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

邓欣德
2023-03-14
问题内容

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

在一个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');