async
在await
循环中使用是否有任何问题?我正在尝试循环遍历文件数组和forEach
每个文件的内容.
import fs from 'fs-promise'
async function printFiles () {
const files = await getFilePaths() // Assume this works fine
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
})
}
printFiles()
Run Code Online (Sandbox Code Playgroud)
这段代码确实有效,但这可能会出错吗?我有人告诉我你不应该使用await
这样的高阶函数,所以我只是想问一下这是否有任何问题.
如何拒绝async/await函数返回的promise?
例如,最初
foo(id: string): Promise<A> {
return new Promise((resolve, reject) => {
someAsyncPromise().then((value)=>resolve(200)).catch((err)=>reject(400))
});
}
Run Code Online (Sandbox Code Playgroud)
转换为async/await
async foo(id: string): Promise<A> {
try{
await someAsyncPromise();
return 200;
} catch(error) {//here goes if someAsyncPromise() rejected}
return 400; //this will result in a resolved promise.
});
}
Run Code Online (Sandbox Code Playgroud)
那么,在这种情况下,我怎么能正确地拒绝这个承诺呢?
javascript asynchronous typescript es6-promise ecmascript-2017
我正在尝试使用新的异步功能,我希望解决我的问题将来会帮助其他人.这是我正在运行的代码:
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await listFiles(nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
Run Code Online (Sandbox Code Playgroud)
问题是,我的while循环运行得太快,并且脚本每秒向google API发送太多请求.因此,我想建立一个延迟请求的睡眠功能.因此我也可以使用此函数来延迟其他请求.如果有其他方式延迟请求,请告诉我.
无论如何,这是我的新代码不起作用.请求的响应返回到setTimeout中的匿名异步函数,但我只是不知道如何将响应返回给sleep函数resp.到最初的asyncGenerator函数.
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await sleep(listFiles, nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
} …
Run Code Online (Sandbox Code Playgroud) 给出以下代码:
var arr = [1,2,3,4,5];
var results: number[] = await arr.map(async (item): Promise<number> => {
await callAsynchronousOperation(item);
return item + 1;
});
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
TS2322:类型'Promise <number> []'不能分配给'number []'类型."承诺<编号>类型不能指定为"编号"类型.
我该如何解决?怎样才能让async await
和Array.map
一起工作?
我一直在浏览async/await,经过几篇文章后,我决定自己测试一下.但是,我似乎无法理解为什么这不起作用:
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = main();
console.log('outside: ' + text);
Run Code Online (Sandbox Code Playgroud)
控制台输出以下内容(节点v8.6.0):
>外面:[对象承诺]
>里面:嘿那里
为什么函数内部的日志消息会在之后执行?我认为创建async/await的原因是为了使用异步任务执行同步执行.
有没有办法可以使用函数内部返回的值而不使用async
after await
?
我正在深入研究节点7 async/await功能,并在这样的代码中保持绊脚石
function getQuote() {
let quote = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
return quote;
} …
Run Code Online (Sandbox Code Playgroud) 使用简单回调时,例如下面的示例:
test() {
api.on( 'someEvent', function( response ) {
return response;
});
}
Run Code Online (Sandbox Code Playgroud)
如何将函数更改为使用async/await?具体来说,假设'someEvent'保证只被调用一次,我希望函数test是一个异步函数,在执行回调之前不会返回,例如:
async test() {
return await api.on( 'someEvent' );
}
Run Code Online (Sandbox Code Playgroud) javascript asynchronous callback async-await ecmascript-2017
是否可以让ES6类getter从ES2017 await/async函数返回一个值.
class Foo {
async get bar() {
var result = await someAsyncOperation();
return result;
}
}
function someAsyncOperation() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve('baz');
}, 1000);
});
}
var foo = new Foo();
foo.bar.should.equal('baz');
Run Code Online (Sandbox Code Playgroud) 我喜欢Async/Await
在Typescript等中提供的新功能的平坦性.但是,我不确定我喜欢这样一个事实,即我必须await
在try...catch
块的外部声明变量才能在以后使用它.像这样:
let createdUser
try {
createdUser = await this.User.create(userInfo)
} catch (error) {
console.error(error)
}
console.log(createdUser)
// business
// logic
// goes
// here
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但似乎最好不要在机构中放置多行业务逻辑try
,所以我只留下createdUser
在块外声明,在块中分配它的替代方案,以及然后用它.
在这种情况下,最佳做法是什么?
现在在Javascript中使用async-await而不是生成器承诺是否安全,知道语法尚未生成并将随ES8的发布而来?
我可以指望哪些浏览器可用,以及这种语法不可用的浏览器有多常见?安全我的意思是没有像巴贝尔这样的转发器?
ecmascript-2017 ×10
async-await ×9
javascript ×8
node.js ×3
promise ×3
asynchronous ×2
ecmascript-6 ×2
typescript ×2
callback ×1
es6-promise ×1
settimeout ×1
try-catch ×1