“optional"switch语句内的生成器

"optional" generator inside a switch statement?

本文关键字:语句 switch optional quot      更新时间:2023-09-26

是否可以在switch语句中使用生成器?如在函数中可能不总是回传一个生成器?

在代码:

function* getWebsite ($) {
  const contents = $('.selector-blah');
  if (contents) {
    const resp = yield http.getHTML({ url: contents.href });
    return resp.finalUrl;
  } else {
    return null;
  }
}
const selectorMappings = {
  name: '#name',
  starRating: getStarRating, // normal function
  website: getWebsite // generator function
}
yield processSelectors($, data, selectorMappings);
// <code> here is excuting before yield is complete above.

processSelectors模块:

const _ = require('lodash');
const sanitizeText = require('./sanitizeText');
module.exports = function* processSelectors ($, data, selectors = {}, route = '') {
  const keys = Object.keys(selectors);
  for (let key of keys) {
    let path = route ? route + '.' + key : key;
    switch (selectors[key].constructor.name) {
      case 'String':
        _.set(data, path, sanitizeText($(selectors[key]).first().text()));
        break;
      case 'Function':
        _.set(data, path, selectors[key]($));
        break;
      case 'GeneratorFunction':
        var result = yield selectors[key]($);
        _.set(data, path, result);
        break;
      case 'Object':
        _.set(data, path, {});
        processSelectors($, data, selectors[key], path);
        break;
    }
  }
};

我确实在forEach中有开关,但为了避免嵌套函数而移出,但没有帮助,也尝试使用co和co.wrap,以及Promise。

通过将整个东西设置为生成器来实现:

yield processSelectors($, data, selectorMappings);
////////////////////////////////////////////////////////
//                       MODULE                       //
////////////////////////////////////////////////////////
const _ = require('lodash');
const sanitizeText = require('./sanitizeText');
module.exports = function* processSelectors ($, data, selectors = {}, route = '') {
  const keys = Object.keys(selectors);
  for (let key of keys) {
    let path = route ? route + '.' + key : key;
    switch (selectors[key].constructor.name) {
      case 'String':
        _.set(data, path, sanitizeText($(selectors[key]).first().text()));
        break;
      case 'Function':
        _.set(data, path, selectors[key]($));
        break;
      case 'GeneratorFunction':
        _.set(data, path, yield selectors[key]($));
        break;
      case 'Object':
        _.set(data, path, {});
        processSelectors($, data, selectors[key], path);
        break;
    }
  }
};