Open rainit2006 opened 7 years ago
async/await Node.js 7.6已经支持async/await了,它取代了promise。
async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是基于Promise实现的,它不能用于普通的回调函数。 async/await与Promise一样,是非阻塞的。 async/await使得异步代码看起来像同步代码,这正是它的魔力所在。
使用Promise是这样的:
const makeRequest = () =>
getJSON()
.then(data => {
console.log(data)
return "done"
})
makeRequest()
使用Async/Await是这样的:
const makeRequest = async () => {
console.log(await getJSON())
return "done"
}
makeRequest()
await关键字只能用在aync定义的函数内。
https://blog.fundebug.com/2017/04/04/nodejs-async-await/ 关于错误处理:Async/Await让try/catch可以同时处理同步和异步错误。
const makeRequest = async () => {
try {
// this parse may fail
const data = JSON.parse(await getJSON())
console.log(data)
} catch (err) {
console.log(err)
}
}
async function は Promise を返し、 await キーワードにより Promise が解決されるのを待つ(かのように見せる)
http://www.ruanyifeng.com/blog/2015/05/async.html 利用async/await实现读取多个文件:
const readFile= (filename, msec) => new Promise((resolve, reject) => {
setTimeout(() => {
console.log(filename);
resolve();
}, msec);
});
const readManyFile= async () => {
await readFile('hello', 1000)
await readFile('async', 200)
await readFile('world', 1000)
doSomething();
}
readManyFile()
异常抛出处理
function a() { return new Promise(resolve) { setTimeout(function() { resolve('hoge') }, 0) } }
async function b() {
console.log(await a())
throw 'hello, '
}
async function c() {
try {
await b() // --- (1)
} catch(e) { // --- (2)
throw e + 'error'
}
}
async function d() {
var val = await c()
console.log("control don't reach here")
}
d().catch(function(val) { console.log(val) }) // --- (3)
a で発生したエラーは async function 自体が捕まえ、自身が返す Promise を reject する。 http://hatz48.hatenablog.com/entry/2015/10/09/225610
注意: await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。
async function myFunction() {
try {
await somethingThatReturnsAPromise();
} catch (err) {
console.log(err);
}
}
用法说明: http://www.webhek.com/post/javascript-async-await-2.html
———————————————————————— Promise 非同期処理の成功時(resolve)、失敗時(reject)の処理を明示的に書くことが出来る 非同期処理を平行・直列に実行させることが出来る. Node.js 4.x以降はPromiseをサポート。
種類
在javascript中实现异步最简单的方式是Callback。遗憾的是,这种编程方式牺牲了控制流,同时你也不能throw new Error()并在外部捕获异常。
一个promise被定义之后有3种状态,pending(过渡状态),fullfilled(完成状态),rejected(错误状态)。一个promise只能是这三种状态种的一种,而无法是他们的混合状态。
http://nya.io/Node-js/promise-in-nodejs-get-rid-of-callback-hell/
var promise = readFile();
promise
.then(function(data){
return JSON.parse(data);
})
.then(function(obj){
obj.prop = 'something new';
console.log(obj);
},function(err){
console.log(err);
});
制作promise的API
一次处理多个promise:
Q.all([
readFile('file1.json'),
readFile('file2.json')
])
.then(function(dataArray){
for(var i = 0; i < dataArray.length; i++){
console.log(dataArray[i]);
}
}, function(err){
console.log(err);
});
async.js https://qiita.com/takeharu/items/84ffbee23b8edcbb2e21