2016-09-26 31 views
0

在switch语句中是否可以有生成器? 由于在函数中可能不总是回传一个生成器?“可选”生成器在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里面的开关,但搬出来避免嵌套功能,但并没有帮助,也采用共尝试和与Promise一起合作。

+2

一个函数或者是发电机或者它不是。它不应该(不能)在运行时决定它想做什么。 *主叫方将如何知道它决定的是什么? – deceze

+0

你可以编写一个永远不会产生的生成器函数,但是你不应该写一个只有时返回一个生成器的函数。 – Bergi

+0

那里'yield processSelectors($,data,selectorMappings);'调用? – Bergi

回答

0

通过使整个事情发电机得到这个工作:

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; 
    } 
    } 
};