如何在Javascript链函数中首先执行第二个函数?

时间:2019-12-10 10:57:10

标签: javascript

问题如下:
创建一个功能GoodMan

GoodMan("Tom")  
  

输出:我是汤姆

GoodMan("Tom").rest(10).learn("computer")  
  

输出:我是汤姆
  //等待10秒
  10秒后开始学习
  学习计算机

GoodMan("Tom").restFirst(5).learn("english")  
  

输出:
   //等待5秒
  5秒后开始学习
  我是汤姆
  学习英语

我已经完成了前两个问题。但是,在第三个问题中,如何在Javascript的链函数中首先执行restFirst(5)函数?
我应该添加一个选择器以确定GoodMan(“ Tom”)是否执行。

代码显示如下:

var GoodMan = function(str){
    var callback_f = new Object;
    str1 = "I am " + str;
    console.log(str1);
    callback_f.rest = function(num){
        sleep(num * 1000);
        console.log ("Start learning after " + num + " seconds");
        return callback_f;
    };
    callback_f.learn = function(str){
        str2 = "Leaning " + str;
        console.log (str2);
    };
    return callback_f;
}

function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}

GoodMan("Tom").rest(10).learn("computer");

2 个答案:

答案 0 :(得分:3)

如何安排任务队列?

function TaskQueue(tasks) {
       return function createQueue(...args) {
           const queue = [];
           let running = false;

           async function processQueue() {
              if(running) return;
              running = true;

              // console.log(queue);
              for(const { task, args } of queue) await task(...args);
              
              running = false;
           }

           function addTask(task, priority, args) {
               queue[priority ? "unshift" : "push"]({ task, args });
               setTimeout(processQueue);
           }

           const instance = {};
           
           for(const [key, priority, task] of tasks) {
              instance[key] = function(...args) { addTask(task, priority, args); return this; };
           }

           if(instance.constructor) instance.constructor(...args);

           return instance;
       };
    }


    const GoodMan = TaskQueue([
      ["constructor", 0, (name) => console.log(`Hi, ${name}`)],
      ["rest", 0, (time) => new Promise(res => setTimeout(res, time * 1000))],
      ["restFirst", 1, (time) => new Promise(res => setTimeout(res, time * 1000))],
      ["learn", 0, subject => console.log(`Learning ${subject}`)]
    ]);

    GoodMan("Tom").restFirst(5).learn("english")

答案 1 :(得分:1)

您可以尝试以下代码:

const goodMan = (name) => {
  return Promise.resolve(`I am ${name}`);
};
const restFirst = (time) => {
  return Promise.resolve(`Start learning after ${time} seconds`);
};
const learn = (subject) => {
  return Promise.resolve(`Learning ${subject}`);
};

const allTogether = (async () => {
  const goodManOutput = await goodMan('Tom');
  const restOutput = await restFirst(5);
  const learnOutput = await learn('English');
  return Promise.resolve(`${restOutput} ${goodManOutput} ${learnOutput}`);
});

allTogether().then(newOutput => {
    console.log(newOutput);
});

希望这会有所帮助。

相关问题