rainit2006 / JS-room

javascript knowledge
0 stars 0 forks source link

Nodejs #5

Open rainit2006 opened 7 years ago

rainit2006 commented 6 years ago

rainit2006 commented 6 years ago

rainit2006 commented 6 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