当前位置: 首页 > 知识库问答 >
问题:

“Async”函数是否应该返回“Promise”对象?

慕嘉茂
2023-03-14

我的问题是:用“async”定义一个返回“promise”的函数(形式上)正确吗?是否容易出现“内存泄漏”?

//Said in plain JavaScript: is the below function correctly declared?
async function amICorrect(){
    return new Promise(() => {}, () => {});
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Why this question? Look at these js functions:
// - - - - - - - - - - - - - - - - - - - - - - - - - - //


// This function is useless, but it is formally correct.
function testS(){}
var s = testS();    
alert(isPromise(s));
// in this case 'isPromise' returns 'false' and that is correct.


// 'async' change the same signature returning a 'Promise' object. 
async function testA(){}
var a = testA();    
alert(isPromise(a));
// Now 'isPromise' returns 'true'. That proves 'async' change the return value from void (in this case) to 'Promise';


// Now we are ready to get why the original question was made:
// Is this signature prone to 'memory leakage'? 
// (when the 'Promise' generated by 'async' replaces the returning 'Promise')
async function amICorrect(){
    return new Promise(() => {}, () => {});
}


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Who knows how the js engine manages this 'configuration'?
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //


// Is the above signature correct or should it be the following?
// (without the 'async' because not needed)
function IAmCorrect(){
    return new Promise(() => {}, () => {});
}



function isPromise(value){
    return ((typeof value) == (typeof new Promise(() => {}, () => {})));
}

对于那些喜欢用自然语言阅读我用js发布的内容的人。

我正在给一个知道JS是如何真正实现的人打电话,然后知道引擎是如何管理我提出的场景的:我们应该避免对返回“promise”的函数使用“async”吗?

我提出的问题不会改变任何人的生活,最终也不会影响表演。事实是,在编写代码时,我喜欢关注代码的正确性,这是我前一段时间的一个疑问。享受

共有1个答案

傅嘉悦
2023-03-14

会有用的,但不是个好主意。

通常,您应该以这两种形式中的任何一种编写异步函数:

/* new style */
async function check(arg) {
    if (arg > 0) {
        return arg;
    } else {
        throw new Error(arg);
    }
}

/* old style */
function check(arg) {
    return new Promise((accept, reject) => {
        if (arg > 0) 
            accept(arg);
        else
            reject(new Error(arg));
    });
}

前者可以被认为是后者的简单语法糖:它们是等价的。两者也可以以相同的方式使用:await关键字完全等同于调用.then方法。

如果你把这些形式混合在一起,它仍然会起作用,这要感谢自动的承诺扁平化。有些人认为扁平化是ECMAScript中的一个设计错误,它肯定会导致一些陷阱,正如(已放弃的)symbol.thenable建议中所讨论的那样。

 类似资料:
  • 问题内容: 我做了异步。现在我可以使用了。 这是示例代码: 所以这里的问题是回报承诺,因为我可以使用它吗? 编辑 当我等待时,它将按顺序运行;当我删除等待时,它将运行? 问题答案: 通常不与promises一起使用,因为很少有这种需求。如果在状态更新()之后调用的方法依赖于更新的状态(),则它可以通过其他方式(例如,作为参数)访问它。 使用回调并且不返回承诺。由于很少需要这样做,因此创建未使用的承

  • 所以我一直很高兴地使用async/await,因为Firebase云函数支持节点8。不过我有一件事要做。当使用可调用函数时,会告诉您必须在函数中返回promise,否则它将无法正常工作。当使用原始promise时,我很清楚如何使用它: 但是现在,随着异步等待,我不确定如何返回这个“promise链”: 有人知道吗?

  • 如果找不到记录,则必须为 api/对象返回哪个 HTTP 状态?我看到以下变体: 返回404 返回200和空白响应,例如{} 我没有找到ruby社区的惯例。什么是最佳实践?

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 在Python中编写不返回值的类型化函数(如其他语言中的“void”)时,最好和/或约定将其标记为以下内容? 或者,是否应该省略

  • 函数getfile: 但我需要一个数组而不是这个promise的东西。怎么解决?