首先,我熟悉异步/同步功能的概念。还有很多与我有关的问题。但是我在任何地方都找不到答案。
所以问题是: 有没有一种方法可以使用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'));
Run Code Online (Sandbox Code Playgroud)
获取此函数值的唯一方法是使用该.then函数。
doStuff('1').then(response => {
console.log(response); // output: mystuffisdone1
doOtherStuffWithMyResponse(response);
// ...
});
Run Code Online (Sandbox Code Playgroud)
现在,我想要的是:
const one = doStuff('1');
console.log(one) // mystuffisdone1
const two = doStuff('2');
console.log(two) // mystuffisdone2
Run Code Online (Sandbox Code Playgroud)
为了说明我自己,我有一个充满回调的异步库。我可以通过使用Promises和async / await来伪造同步行为,从而将该异步行为转换为同步行为。但是仍然存在一个问题,它最终还是异步的。超出异步功能范围。
doStuff('1').then((r) => {console.log(r)};
console.log('Hello wolrd');
Run Code Online (Sandbox Code Playgroud)
结果为:Hello worldthen mystuffisdone1。这是使用异步/等待功能时的预期行为。但这不是我想要的。
现在我的问题是:没有关键字async,有没有办法做与await一样的事情?使代码同步?如果不可能,为什么?
编辑:
谢谢您提供的所有答案,我想我的问题并不是所有问题都显而易见。为了澄清我的想法,这是我对@Nikita Isaev答案的评论。
“我理解为什么所有I / O操作都是异步完成;还是并行完成。但是我的问题更多的是,为什么引擎不以异步方式阻止同步函数的调用者?我的意思 …
我为此苦苦挣扎:
b'"\xc2\xb7\xed\xa0\x81\xed\xb1\x96\xed\xa0\x81\xed\xb1\xb1\xed\xa0\x81\xed\xb1\x9d\xed\xa0\x81\xed\xb1\xbe\xed\xa0\x81\xed\xb1\xaf \xed\xa0\x81\xed\xb1\xa9\xed\xa0\x81\xed\xb1\xa4\xed\xa0\x81\xed\xb1\x93\xed\xa0\x81\xed\xb1\xa9\xed\xa0\x81\xed\xb1\x9a\xed\xa0\x81\xed\xb1\xa7\xed\xa0\x81\xed\xb1\x91"@en'
它来自(dbpedia 3.5.1(http://dbpedia.org/page/Shavian_alphabet))的HDT压缩版本(https://github.com/rdfhdt/hdt-cpp)的二进制格式,并且很好本网站(https://mothereff.in/utf-8)在utf8中解码
意思是:“·” @en
但是在python 3.7.3中,我遇到了一个众所周知的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 3: invalid continuation byte尝试mystring.decode('utf8')
如果我尝试做相反的事情: '"· "@en'.encode('utf8)我得到以下表示形式:b'"\xf0\x90\x91\x96\xf0\x90\x91\xb1\xf0\x90\x91\x9d\xf0\x90\x91\xbe\xf0\x90\x91\xaf \xf0\x90\x91\xa8\xf0\x90\x91\xa4\xf0\x90\x91\x93\xf0\x90\x91\xa9\xf0\x90\x91\x9a\xf0\x90\x91\xa7\xf0\x90\x91\x91"@en'它不是完全相同的字符串,但是随后repr.decode('utf8')正确地解码为相同的东西。
有人可以帮助我了解为什么解码第一个字节字符串不起作用吗?我知道由于错误,第一个字节字符串不是有效的UTF-8字符串。但是,为什么我所链接的网站对它的解码效果很好,而python无法做到?先感谢您!
最终编辑 接受答案后,我对此进行了一些额外的研究,发现该字符串是使用CESU-8编解码器编码的。今天显然已经弃用了。但是有些人仍在使用它...因此,我找到了一个可以写utf-8编解码器变体的程序包,它可以解码此字符串。我认为这将帮助很多与我有相同问题的人。Python库:https://github.com/LuminosoInsight/python-ftfy 添加的编解码器为'utf-8-variants'。我希望这会帮助比我有同样需求的人们。