Javascript 等待返回和不等待返回有区别吗

Javascript 等待返回和不等待返回有区别吗,javascript,node.js,typescript,asynchronous,Javascript,Node.js,Typescript,Asynchronous,我只是在想我们需要使用wait操作符,下面两种情况的区别是什么 一个 两个 我认为结果没有区别,但我认为完全没有必要使用async await,因为将返回一个承诺,我们只需要在异步函数中调用updateOne函数时使用await操作符 等待返回与不等待返回有区别吗。。。我认为结果没有差别 是的,你说得对。在你的例子中没有区别 调用异步函数时,它返回一个承诺。当异步函数返回一个值时,将使用返回的值解析承诺。当异步函数抛出异常或某个值时,承诺将被抛出的值拒绝 异步函数可以包含等待表达式,该表达式暂

我只是在想我们需要使用wait操作符,下面两种情况的区别是什么

一个

两个

我认为结果没有区别,但我认为完全没有必要使用async await,因为将返回一个承诺,我们只需要在异步函数中调用updateOne函数时使用await操作符

等待返回与不等待返回有区别吗。。。我认为结果没有差别

是的,你说得对。在你的例子中没有区别

调用异步函数时,它返回一个承诺。当异步函数返回一个值时,将使用返回的值解析承诺。当异步函数抛出异常或某个值时,承诺将被抛出的值拒绝

异步函数可以包含等待表达式,该表达式暂停异步函数的执行并等待传递的承诺的解析,然后恢复异步函数的执行并返回解析的值


我们只需要在异步函数中调用updateOne函数时使用wait操作符

不完全是这样,
async
操作符只允许在相应的函数中使用
await
,而
await
操作符在该异步函数中执行的所有操作都是对它将在
中返回的值的承诺展开。然后(value=>/*使用value*/)回调。目的是使代码类似于更熟悉的同步控制流

任何调用
async
函数(即返回类型)的结果都将是对您返回的任何内容的承诺,但请注意,您仍然可以在
async
函数中使用未包装的承诺(即没有
wait
),这些值将仅包装在承诺中

如果你还需要帮助,请告诉我。我将修改这篇文章

函数simplePromise(){return Promise.resolve('resolved value');}
异步函数asyncWaitTest(){
const simplePromiseValue=等待simplePromise();
console.log(simplePromiseValue);//解析值
//如果不使用'await'关键字,那么承诺仍然是承诺
simplePromise().then(value=>console.log(value));
}
异步测试()
等待返回与不等待返回有区别吗。。。我认为结果没有差别

是的,你说得对。在你的例子中没有区别

调用异步函数时,它返回一个承诺。当异步函数返回一个值时,将使用返回的值解析承诺。当异步函数抛出异常或某个值时,承诺将被抛出的值拒绝

异步函数可以包含等待表达式,该表达式暂停异步函数的执行并等待传递的承诺的解析,然后恢复异步函数的执行并返回解析的值


我们只需要在异步函数中调用updateOne函数时使用wait操作符

不完全是这样,
async
操作符只允许在相应的函数中使用
await
,而
await
操作符在该异步函数中执行的所有操作都是对它将在
中返回的值的承诺展开。然后(value=>/*使用value*/)回调。目的是使代码类似于更熟悉的同步控制流

任何调用
async
函数(即返回类型)的结果都将是对您返回的任何内容的承诺,但请注意,您仍然可以在
async
函数中使用未包装的承诺(即没有
wait
),这些值将仅包装在承诺中

如果你还需要帮助,请告诉我。我将修改这篇文章

函数simplePromise(){return Promise.resolve('resolved value');}
异步函数asyncWaitTest(){
const simplePromiseValue=等待simplePromise();
console.log(simplePromiseValue);//解析值
//如果不使用'await'关键字,那么承诺仍然是承诺
simplePromise().then(value=>console.log(value));
}

异步测试()在这个用例中,最终结果没有区别,但它的工作方式有所不同

在异步函数中返回一个等待的承诺将返回另一个承诺,该承诺将通过等待的承诺的值得到解决,这基本上是两个承诺,在本用例中是多余的,因为您没有对承诺进行任何额外的处理


在常规函数中返回一个承诺只会按原样返回该承诺,而不会将其包装在另一个承诺中,因此您完全正确地认为不需要以这种方式使用async Wait。

在本用例中,最终结果没有区别,但它的工作方式有所不同

在异步函数中返回一个等待的承诺将返回另一个承诺,该承诺将通过等待的承诺的值得到解决,这基本上是两个承诺,在本用例中是多余的,因为您没有对承诺进行任何额外的处理


在常规函数中返回一个承诺只会按原样返回该承诺,而不会将其包装在另一个承诺上,因此您完全正确地认为不需要以这种方式使用async await。

唯一的区别是内存使用情况,因为可能会创建一个中间承诺对象,所以它会使用更多的内存

Async/Await的另一个优点是,它允许我们在一个好的try/catch块中捕获任何意外错误。我们只需要像这样包装我们的等待电话:

async function doSomethingAsync(){
    try {
    // This async call may fail.
    let result = await someAsyncCall();
    }
    catch(error) {
    // If it does we will catch the error here.
    }  
}
catch子句将处理err
public updateOne(Model, doc, errorMsg?){
    return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec();
}
async function doSomethingAsync(){
    try {
    // This async call may fail.
    let result = await someAsyncCall();
    }
    catch(error) {
    // If it does we will catch the error here.
    }  
}
public async updateOne(Model, doc, errorMsg?){
    return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec();
}
return new Promise((resolve, reject) => {
  Model.findOneAndUpdate(...).then(resolve, reject)
})
return new Promise(resolve => resolve(Model.findOneAndUpdate(...))
return Model.findOneAndUpdate(...)
/*async*/ write(){
  return this.db.write()
}