2017-11-11 101 views
1

我只是想着我们需要使用await操作符,以下两种情况有什么区别。返回值有没有差别

一个

public async updateOne(Model, doc, errorMsg?){ 
    return await Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec(); 
} 
public updateOne(Model, doc, errorMsg?){ 
    return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec(); 
} 

我认为这是在结果没有区别,但我认为这是完全没有必要使用异步等待,因为一个承诺将返回,当我们在异步函数中调用updateOne函数时,我们只需要使用await运算符。

+1

是的,如果你只是在等待退货承诺,那是多余的。 –

回答

2

由于Oyverus answered,结果没有任何区别,但使用async函数将创建另一个Promise,我已经为每个案例添加了一些粗略的示例。

使用async updateOne(){ return await Model.findOneAndUpdate(...) }结果无极代码是这样的:

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() 
} 
1

返回与等待还是没有有区别? ...我认为结果没有区别

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

From MDN:

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

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


我们只需要在我们调用异步函数内部updateOne功能使用的await操作。

不完全是,在async运营商刚刚启用相应的函数中使用的await和所有await符不内的异步函数是解开一个承诺,它将在.then(value => /* do stuff with value */)回调中返回值。目的是让代码类似于更熟悉的同步控制流程。

一个async功能的任何调用的结果(即它的返回类型)将是一个承诺无论你返回,但注意,您仍然可以在async函数使用展开的承诺(不await IE),该值将只被包裹在承诺中。

让我知道你是否仍然需要帮助理解。我会修改这个帖子。

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

在该使用情况,没有在最终结果的差异,但在它是如何工作的差异。

在一个异步函数中返回一个期待的承诺将返回另一个承诺,它将等待承诺的值得到解决,这基本上是两个承诺,在这个用例中是多余的,因为你没有做任何额外的处理承诺。

在普通函数中返回一个promise只会按原样返回该promise,而不会将其包装在另一个promise中,因此您完全正确,因此不需要以这种方式使用async await。

1

唯一不同的是内存使用情况,其中return await使用更多,因为可能会创建一个中间Promise对象。

Async/Await的另一件好事是它可以让我们捕捉到一个很好的旧try/catch块中的任何意外错误。我们只需要来包装我们的await调用是这样的:

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块内写的等待异步调用或其他任何故障代码引起的错误。

1

如果唯一的返回值是应用await运算符的结果,那么您不需要使用async函数就是正确的。从其他地方不使用await的同步函数返回await的承诺操作数是等同的(如在示例“two”中编码)。

的逻辑链,我们只需要在我们调用异步函数

内updateOne功能使用的await运算符但是并不确切。您可以从一个异步函数内不使用await

public async updateOne(Model, doc, errorMsg?){ 
    return Model.findOneAndUpdate({'_id': doc._id}, {'$set': doc}, {upsert:true, new: true}).lean().exec(); 
} 

回报的承诺,其中通过Model返回的承诺将被用来解决由async返回的承诺。