【发布时间】:2018-06-11 07:25:51
【问题描述】:
首先我熟悉异步/同步函数的概念。 还有很多与我有关的问题。但我在任何地方都找不到我的答案。
所以问题是: 有没有办法使用 async/await 返回值而不是 Promise ?作为同步函数。
例如:
async doStuff(param) {
return await new Promise((resolve, reject) => {
setTimeout(() => {
console.log('doStuff after a while.');
resolve('mystuffisdone'+param);
}, 2000);
});
}
console.log(doStuff('1'));
获取此函数值的唯一方法是使用.then 函数。
doStuff('1').then(response => {
console.log(response); // output: mystuffisdone1
doOtherStuffWithMyResponse(response);
// ...
});
现在,我想要的是:
const one = doStuff('1');
console.log(one) // mystuffisdone1
const two = doStuff('2');
console.log(two) // mystuffisdone2
为了解释我自己,我有一个充满回调的异步库。我可以通过使用 Promises 和 async/await 来伪造同步行为,将这种异步行为转变为同步行为。 但是还有一个问题,到底还是异步的;超出了异步函数的范围。
doStuff('1').then((r) => {console.log(r)};
console.log('Hello wolrd');
这将导致:Hello world 然后mystuffisdone1。这是使用 async/await 函数时的预期行为。但这不是我想要的。
现在我的问题是:有没有办法在没有关键字 async 的情况下执行与 await 相同的操作?使代码同步?如果不可能,为什么?
编辑:
感谢您的所有回答,我认为我的问题对所有人来说都不是显而易见的。为了澄清我的想法,这是我对@Nikita Isaev 回答的评论。
“我明白为什么所有 I/O 操作都是异步完成的;或者并行完成。但我的问题更多的是关于为什么引擎不以异步方式阻塞同步函数的调用者的事实?我的意思是const a = doStuff(...)是一个Promise,我们需要调用.then才能得到这个函数的结果。但是为什么JavaScript或者Node引擎不会阻塞调用者(只是调用的块)。如果可以的话,我们可以const a = doStuff(...),等待并在a 中得到结果,而不阻塞主线程。就像async/await 一样,为什么没有sync/wait 的地方?”
希望现在更清楚,请随时发表评论或提出任何问题:)
编辑2:
答案为什么的所有精度都在接受答案的 cmets 中。
【问题讨论】:
-
async函数自然返回Promise。您需要做的是在另一个async函数中调用所有async函数,并在它们返回的Promises 上调用await。 -
您无法从异步调用中获得同步结果。你说你熟悉异步/同步函数,但你没有看到异步调用不可能同步结果。想了一会儿,你应该明白为什么这是不可能的
-
您无法使异步代码同步。由于您现在无法打开包裹,因此将在一周左右交付。你必须等待它;在这两种情况下。
-
在
return await new Promise(...)中,await有点毫无意义;喜欢写return new Promise((resolve, reject) => new Promise(...).then(resolve, reject))。你可以简单地写return new Promise(...) -
谢谢大家的回答。我看到不可能做到这一点,我只是想知道为什么这不可能?是的,我的错误,return 语句将在异步函数的末尾返回 promise 的值。
标签: javascript asynchronous synchronous