我只是想我们需要使用await运算符,以下两种情况之间有什么区别。
一个
public async updateOne(Model, doc, errorMsg?){
return await Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec();
}
2
public updateOne(Model, doc, errorMsg?){
return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec();
}
我认为结果没有区别,但我认为完全没必要使用async await,因为会返回一个promise,而我们只需要在调用updateOne函数时使用await运算符。异步功能。
答案 0 :(得分:3)
在这个用例中,最终结果没有区别,但它的工作方式有所不同。
在async函数中返回一个等待的promise将返回另一个使用等待的promise的值解决的promise,这基本上是两个promise,在这个用例中是多余的,因为你没有做任何额外的处理承诺。
在常规函数中返回一个promise只会按原样返回该promise,并且不会将其包含在另一个promise中,所以你完全正确,没有必要以这种方式使用async await。
答案 1 :(得分:3)
作为Oyverus answered,结果没有区别,但使用async
函数会创建另一个Promise,我为每个案例添加了一些粗略的例子。
使用async updateOne(){ return await Model.findOneAndUpdate(...) }
会导致Promise代码如下:
return new Promise((resolve, reject) => {
Model.findOneAndUpdate(...).then(resolve, reject)
})
然后async updateOne(){ return Model.findOneAndUpdate(...) }
是:
return new Promise(resolve => resolve(Model.findOneAndUpdate(...))
普通updateOne(){ return Model.findOneAndUpdate(...) }
是:
return Model.findOneAndUpdate(...)
我倾向于在可能的情况下使用普通返回,但在代码中留下/*async*/
以用于文档目的。
/*async*/ write(){
return this.db.write()
}
答案 2 :(得分:1)
是的,你做对了。在你的例子中没有区别。等待或不等的回报有区别吗? ......我认为结果没有区别
当调用异步函数时,它返回一个Promise。当异步函数返回一个值时,将使用返回的值解析Promise。当异步函数抛出异常或某个值时,将使用抛出的值拒绝Promise。
异步函数可以包含一个await表达式,它暂停执行异步函数并等待传递的Promise的解析,然后恢复异步函数的执行并返回已解析的值。 / p>
当我们在异步函数中调用updateOne函数时,我们只需要使用await运算符。
不完全一样,async
运算符只允许在相应的函数中使用await
,并且所有await
运算符都在async函数中解析了它将对值赋值在.then(value => /* do stuff with value */)
回调中返回。目的是使代码类似于更熟悉的同步控制流程。
调用async
函数(即它的返回类型)的结果将是你返回的任何内容的承诺,但请注意你仍然可以使用未包装的promises(即没有await
) async
函数,值将包含在promises中。
如果您仍需要帮助理解,请告诉我。我将修改这篇文章。
function simplePromise() { return Promise.resolve('resolved value'); }
async function asyncAwaitTest() {
const simplePromiseValue = await simplePromise();
console.log(simplePromiseValue); // resolved value
// if you don't use the `await` keyword, then the promise will still be a promise
simplePromise().then(value => console.log(value));
}
asyncAwaitTest();

答案 3 :(得分:1)
唯一不同的是内存使用,return await
使用更多,因为可能会创建一个中间Promise对象。
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子句将处理由等待的异步调用或我们可能在try块中编写的任何其他失败代码引发的错误。
答案 4 :(得分:1)
如果唯一的返回值是应用async
运算符的结果,则您不需要使用await
函数。从其他地方不使用await
的同步函数返回await
的promise操作数是等效的(如您在示例“two”中编写的那样)。
的逻辑链
当我们在异步函数
中调用updateOne函数时,我们只需要使用await运算符
然而并不确切。您可以使用{/ 1>}在
中使用{/ 1>在异步函数中返回承诺。3
await
public async updateOne(Model, doc, errorMsg?){
return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec();
}
返回的承诺将用于解决Model
返回的承诺。