anchor.diff:  // 複数のリソースを取得し、レスポンスボディの配列を返す
   function fetchResources(resources) {
       const results = [];
  +    // 配列をpromise chainにして順番に処理する
       return resources.reduce(function (promise, resource) {
  -        return dummyFetch(resource).then(function(response) {
  -            results.push(response.body);
  +        return promise.then(function(){
  +            return dummyFetch(resource).then(function(response) {
  +                results.push(response.body);
  +                return results;
  +            });
           });
       }, Promise.resolve());
   }
  
positive.code:     });
  }
  // `then`メソッドで成功時と失敗時に呼ばれるコールバック関数を登録
  // /success/data のリソースは存在するので成功しonFulfilledが呼ばれる
  dummyFetch("/success/data").then(function onFulfilled(response) {
      console.log(response); // => { body: "Response body of /success/data" }
  }, function onRejected(error) {
      // この行は実行されません
  });
  // /failure/data のリソースは存在しないのでonRejectedが呼ばれる
  dummyFetch("/failure/data").then(function onFulfilled(response) {
      // この行は実行されません
  }, function onRejected(error) {
      console.log(error.message); // => "NOT FOUND"
  
negative.code: function dummyFetch(path) {
      return new Promise(function(resolve, reject){
          setTimeout(function(){
              if (path.startsWith("/resource")) {
                  resolve({ body: `Response body of ${path}` });
              } else {
                  reject(new Error("NOT FOUND"));
  