返回等待与否之间是否存在差异

时间:2017-11-11 01:52:10

标签: javascript node.js typescript asynchronous

我只是想我们需要使用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运算符。异步功能。

5 个答案:

答案 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)

  

等待或不等的回报有区别吗? ......我认为结果没有区别

是的,你做对了。在你的例子中没有区别。

From MDN:

  

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

     

异步函数可以包含一个await表达式,它暂停执行异步函数并等待传递的Promise的解析,然后恢复异步函数的执行并返回已解析的值。 / p>

  

当我们在异步函数中调用updateOne函数时,我们只需要使用await运算符。

不完全一样,async运算符只允许在相应的函数中使用await,并且所有await运算符都在async函数中解析了它将对值赋值在.then(value => /* do stuff with value */)回调中返回。目的是使代码类似于更熟悉的同步控制流程。

调用async函数(即它的返回类型)的结果将是你返回的任何内容的承诺,但请注意你仍然可以使用未包装的promises(即没有awaitasync函数,值将包含在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返回的承诺。