node.js - 为什么使用node co模块能并行调用接口
PHP中文网
PHP中文网 2017-04-17 14:24:45
0
1
314

node端调用接口。
有一个list页面,for循环里每次都会调用一次接口取信息,导致接口串行调用频繁,耗费时间非常多。
改用co模块来将放在一起统一调用后,速度提升非常多。疑问来了,为什么用co会变成并行调用接口了?

使用co后大致代码是这样:里面的几个函数都是去调用接口的函数。

for (var i=0;i<feedCount; i++) {
        var item = {
            offerDetails: getOfferDetails(),

            feedPVCount: getFeedCount(),

            beSavedCount: getFavedCount()
        };

        var defer = co(function* () {
            return yield item;
        });
        results.push(defer);
    }

    results = yield results;
PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(1)
Peter_Zhu

1、co() 將generator函數包裝成promise
2、results是一個promise數組,可迭代的;若在yield後的是Promise數組或屬性值為Promise對象的對象,則並行執行這些Promise。

具體你可以看下co源碼:

function toPromise(obj) {
  //确保obj有意义
  if (!obj) return obj;
  //如果已经是Promise对象,则直接把obj返回出去
  if (isPromise(obj)) return obj;
  //若是generator函数或现成的generator对象,则直接把obj作为参数传入co函数,并把这个co函数
  //返回出来的"外壳Promise"作为return出来的Promise
  if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
  //若obj是函数,则直接视为符合thunk规范的函数(thunk函数是啥这里就不细说了哈。。),直接转换
  if ('function' == typeof obj) return thunkToPromise.call(this, obj);
  //若是Promise数组,则调用arrayToPromise方法
  if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
  //若是属性值是Promise对象的对象,则调用objectToPromise方法
  if (isObject(obj)) return objectToPromise.call(this, obj);
  return obj;
}

function arrayToPromise(obj) {
  // Promise.all 并行执行
  return Promise.all(obj.map(toPromise, this));
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!