在javascript中将for循环的部分放入函数中

时间:2017-04-23 23:54:08

标签: javascript for-loop

我有几个函数使用下面给出的循环。

======================================================================
ERROR: Failure: RuntimeError (No test device specified.  Specify one using the DEVICE or GPUARRAY_TEST_DEVICE environment variables.)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/me/anaconda3/envs/py35/lib/python3.5/site-packages/nose/failure.py", line 39, in runTest
    raise self.exc_val.with_traceback(self.tb)
  File "/home/me/anaconda3/envs/py35/lib/python3.5/site-packages/nose/loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "/home/me/anaconda3/envs/py35/lib/python3.5/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/home/me/anaconda3/envs/py35/lib/python3.5/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/me/anaconda3/envs/py35/lib/python3.5/imp.py", line 234, in load_module
    return load_source(name, filename, file)
  File "/home/me/anaconda3/envs/py35/lib/python3.5/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 693, in _load
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/me/.local/lib/python3.5/site-packages/pygpu-0.6.2-py3.5-linux-x86_64.egg/pygpu/tests/test_tools.py", line 5, in <module>
    from .support import (guard_devsup, rand, check_flags, check_meta, check_all,
  File "/home/me/.local/lib/python3.5/site-packages/pygpu-0.6.2-py3.5-linux-x86_64.egg/pygpu/tests/support.py", line 32, in <module>
    context = gpuarray.init(get_env_dev())
  File "/home/me/.local/lib/python3.5/site-packages/pygpu-0.6.2-py3.5-linux-x86_64.egg/pygpu/tests/support.py", line 29, in get_env_dev
    raise RuntimeError("No test device specified.  Specify one using the DEVICE or GPUARRAY_TEST_DEVICE environment variables.")
RuntimeError: No test device specified.  Specify one using the DEVICE or GPUARRAY_TEST_DEVICE environment variables.

----------------------------------------------------------------------
Ran 7 tests in 0.003s

FAILED (errors=7)
<nose.result.TextTestResult run=7 errors=7 failures=0>

function startClaw(dir){ var readCount = 0; for(var isRead in qdata){ readCount++; if(qdata[isRead]['reading'] == true){ return; }else if(readCount == 5){ isAnimating = $("#claw").is(':animated'); if(!isAnimating){// prevents multiple clicks during animation if(isMoving || isDropping){ return; } MCI = setInterval(function(){ moveClaw(dir); },10); //console.log("startClaw:" + dir); stopSwingClaw(); } } } } //................................................................. function dropClaw(){ var readCount = 0; for(var isRead in qdata){ readCount++; if(qdata[isRead]['reading'] == true){ return; }else if(readCount == 5){ if(isDropping){ return; } //prevent multiple clicks stopSwingClaw(); isDropping = true; MCI = setInterval(moveDown,20); //start heartbeat } } } 语句中的所有内容在各种函数中都是不同的。我想知道是否有办法放置&#34;件#34;将else if外部的for循环转换为它自己的函数。很久以前我觉得我已经看过这个或已经做过这件事了,但它逃脱了我,我无法找到任何例子。谢谢大家!

2 个答案:

答案 0 :(得分:1)

您可以将一个函数传递给另一个函数来实现此目的。我已为fs.nr_open = 1048576完成了此操作,我的示例中应该清楚如何提取dropClaw

startClaw

答案 1 :(得分:1)

预览,我看到这与上面的相似。两个差异(看起来像)在这里,计数被传递给函数,以防它们需要在if语句中进行不同的检查,并且,它检查返回值是什么,因为它看起来像你返回如果条件满足则循环下面的代码中有注释中的注释。

function startClaw(dir) {
  // Pass a function as a callback to the method which expects to receive the count as a param
  doReadCount(qdata, function(theCount) { 
    if (theCount === 5) {
      isAnimating = $("#claw").is(':animated');
      if (!isAnimating) { // prevents multiple clicks during animation
        if (isMoving || isDropping) {
          return true;
        }
        MCI = setInterval(function() { moveClaw(dir); }, 10);
        //console.log("startClaw:" + dir);
        stopSwingClaw();
      }

      return false;
  });
}
//.................................................................
function dropClaw() {
  // Pass a function as a callback to the method which expects to receive the count as a param
  doReadCount(qdata, function(theCount) {
    if (theCount === 5) {
      if (isDropping) {
        return;
      } //prevent multiple clicks

      stopSwingClaw();
      isDropping = true;
      MCI = setInterval(moveDown,20); //start heartbeat
    }
  });
}

function doReadCount(qdata, elseFunction) {
  var readCount = 0;
  var elseReturn;
  for (var isRead in qdata) {
      readCount++;
      if (qdata[isRead]['reading'] == true) {
                return;
      } else {
        // call the function that was sent and pass it the current read count. If the return is true, then also return true here
        elseReturn = elseFunction(readCount);
        if (elseReturn) {
            return;
        }
      }
    }
  }