无法同步功能

时间:2019-05-25 14:24:53

标签: javascript browser-automation

我正在尝试一次同步地执行功能。

var subtasks = ['Site', 'Draw', 'Material', 'Conduction', 'Cable', 'Install', 'Foundation']

function clickMe() {
  return new Promise(resolve => {
    jQuery("#addtoptasksubmit").trigger("click"); // triggering the button click
    resolve("done click");
  });
}

function typeWord(word) {
  return new Promise(resolve => {
    jQuery("#todotask").val(word); // input
    resolve("done type");
  });
}

function createSubTask() {
  return new Promise(res => {
    jQuery('#todotask').focus();
    res("done")

  })
};

function startLoop(i) {
  new Promise(resolve => {
    var promise = createSubTask();
    promise.then(resolve => {
      var typePromise = typeWord(subtasks[i]);
      typePromise.then((resolve) => {
        var clickPromise = clickMe();
        clickPromise.then((resolve) => {
          console.log(resolve);
        });
      });
    });
  })
}

let i = 0;
let prom = startLoop(i);

prom.then((res) => {
  startLoop(i++);
})

代码无法正常工作,我也想自动递增。 For循环没有显示。

我已经尝试在chrome上使用循环和递归异步功能。

2 个答案:

答案 0 :(得分:1)

您的startLoop(i)函数是否不需要对新Promise()调用的返回语句?我必须想象一下:

// prom = undefined as startLoop never returns anything
let prom = startLoop(i);

这样更改代码:

// Current code from description
function startLoop(i) {
  new Promise(resolve => {

// Fixed code
function startLoop(i) {
  return new Promise(resolve => {

答案 1 :(得分:0)

var subtasks = ['Site', 'Draw', 'Material', 'Conduction', 'Cable', 'Install', 'Foundation'];

function clickMe() {
  return new Promise(resolve => {
    setTimeout(() => {
      jQuery("#addtoptasksubmit").trigger("click");
      resolve("done click");
    }, 1000);
  });
}

function typeWord(word) {
  return new Promise(resolve => {
    jQuery("#todotask").val(word);
    resolve("done type");
  });
}


function createSubTask() {
  return new Promise(res => {
    jQuery('#todotask').focus();
    res("done");

  })
};

function startLoop(i) {
  return new Promise(res => {
    var promise = createSubTask();
    promise.then(
      (resolve) => {
        var typePromise = typeWord(subtasks[i]);
        typePromise.then((resolve) => {
          console.trace(resolve);
          var clickPromise = clickMe();
          clickPromise.then((resolve) => {
            console.trace(resolve);
            res("done loop " + subtasks[i]);
          });
        });
      }
    );
  })
}

var _index_ = 0;

var _how_ = setInterval(() => {
  if (_index_ < subtasks.length) {
    let loopPromise = startLoop(_index_);
    loopPromise.then((resolve) => {
      _index_ += 1;
    });
  } else {
    console.log("all done go get the new task");
    clearInterval(_how_);
  }
}, 10000);

我可以进一步优化它。...