我正在使用aiohttp构建一个API服务器,将TCP请求发送到单独的服务器.发送TCP请求的模块是同步的,并且是出于我的目的的黑盒子.所以我的问题是这些请求阻止了整个API.我需要一种方法将模块请求包装在异步协程中,该协程不会阻止API的其余部分.
所以,仅仅使用sleep一个简单的例子,有没有办法以某种方式将耗时的同步代码包装在非阻塞协程中,如下所示:
async def sleep_async(delay):
# After calling sleep, loop should be released until sleep is done
yield sleep(delay)
return 'I slept asynchronously'
Run Code Online (Sandbox Code Playgroud) 对于 JavaScript 中的传统对象,使用以下Object.keys方法很容易检查它是否为空:
const emptyObj = {};
console.log(Object.keys(emptyObj).length === 0); // true, i.e. "empty"
const populatedObj = { foo: 'bar' };
console.log(Object.keys(populatedObj).length === 0); // false, not empty
Run Code Online (Sandbox Code Playgroud)
尽管有点多余,但如果您愿意,也可以对数组使用相同的方法:
const emptyArr = [];
console.log(Object.keys(emptyArr).length === 0); // true
const populatedArr = [1, 2, 3];
console.log(Object.keys(populatedArr).length === 0); // false
Run Code Online (Sandbox Code Playgroud)
然而,ES6 方便的新数据结构Map和Set 的工作方式不同。如果您尝试Object.keys在它们上使用,您将始终得到一个空数组!
const populatedSet = new Set(['foo']);
console.log(Object.keys(populatedSet).length); // 0
const populatedMap = new Map([['foo', 1]]);
console.log(Object.keys(populatedMap).length); // 0
Run Code Online (Sandbox Code Playgroud)
那么,检查您喜欢的新 …
因此,我有一个第三方SDK,写为基于Oldschool IIFE的模块。换句话说,它看起来像这样:
var ThirdPartySDK = (function() {
var export = {};
// Add some methods to export
return export;
})();
Run Code Online (Sandbox Code Playgroud)
然后,您应该通过在全局范围内引用它来使用它,如下所示:
<html>
<body>
<script src="lib/ThirdPartySDK.js">
<script>
ThirdPartySDK.foo();
<\script>
<\body>
<\html>
Run Code Online (Sandbox Code Playgroud)
当然,我仍然可以以这种方式使用它,但这真的是Angular和TypeScript的最佳实践吗?有什么方法可以使用angular / TypeScript / webpack进行设置,以便可以使用正确的import语句?像这样:
import { ThirdPartySDK } from '../lib/ThirdPartySDK.js';
ThirdPartySDK.foo();
Run Code Online (Sandbox Code Playgroud) javascript ×2
aiohttp ×1
angular ×1
asynchronous ×1
ecmascript-6 ×1
iife ×1
python ×1
python-3.x ×1
typescript ×1
webpack ×1