Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

coの使い方メモ

More than 3 years have passed since last update.

ES6でPromiseが入ってきたので、coをつかってPromiseを体験してみた

バージョン

Node.js 4.1.1
co 4.6.0

プログラム内容

奇数の時はその値を表示表示し、偶数の時はエラーを返す

coを使わない場合

こんな感じになるので, getPromiseが何回も呼ばれるとネストがうざくなる

function getPromise(i) {
  return new Promise((resolve, reject) => i % 2 !== 0 ? resolve(i) : reject(new Error(i)))
}

function onSuccess(result) {
  console.log('success', result)
}
function onError(e) {
  console.log('error', e)
}


getPromise(1)
  .then(onSuccess)
  .then(() =>
    getPromise(2)
      .then(onSuccess)
      .catch(onError)
  )
  .catch(onError)

coを使った場合

var co = require('co')
co(function *(){
  onSuccess(yield getPromise(1))
  onSuccess(yield getPromise(2))
})
.catch(onError)

実行結果

success 1
error [Error: 2]

ざっくりとした使い方

coの中でreturnを呼ぶとthenが呼ばれる

co(function *(){
  return yield getPromise(1)
})
.then(onSuccess).catch(onError)

Promiserejectが呼ばれた時はエラーが発生するので、try-catchで捕まえる事ができる。ただし、この時はthenのあとに設定しているcatch(onError)は呼ばれない。呼びたいときはthrowする

co(function *(){
  try {
    let r = yield getPromise(2)
    console.log(r)
    return r
  } catch (e) {
    console.log('error catch', e)
  }
})
.then(onSuccess)
.catch(onError)

エラーがキャッチされない場合はcatch(onError)が呼ばれる

co(function *(){
  let r = yield getPromise(2)
  console.log(r)
  return r
})
.then(onSuccess)
.catch(onError)

co.wrapは以下の様な感じになるがいまいちいい使い方が思いつかない。
連続して呼び出せないものか。

let p = co.wrap(function *(i){
  return yield new Promise((resolve, reject) => {
    return i%2 === 0 ? reject(new Error(i)) :resolve(i)
  });
});
p(1).then(onSuccess).catch(onError)
hachi_eiji
Webエンジニアやってます
http://hachi.hatenablog.com/
classi
学校の先生・生徒・保護者向けのB2B2Cの学習支援Webサービス「Classi(クラッシー)」 を開発・運営している会社です。
https://classi.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away