【问题标题】:node promise delay 10 sec then return itself?节点承诺延迟 10 秒然后返回自身?
【发布时间】:2015-12-21 04:24:57
【问题描述】:

我正在使用q 在我的项目中实现承诺,我想做这样的事情:

  1. 检查是否a >= 10,如果是,则返回;
  2. 如果没有,请再次调用自身。

我的代码是错误的,但它可以帮助你理解我:

var Q = require("q");

function delay(ms) {
  var deferred = Q.defer();
  setTimeout(deferred.resolve, ms);
  return deferred.promise;
}

function wait(a) {
  var deferred = Q.defer();
  if (a >= 10) {
    deferred.resolve(a);
  } else {
    console.log("wait " + a);
    delay(10).then(wait(a + 1)).then(deferred.resolve(a));
  }

  return deferred.promise;
}

wait(1).then(console.log); // what I want is 10 instead of 1

【问题讨论】:

  • 您希望在代码末尾的最后一个 console.log 中显示什么值?现在,它是空的。
  • @Mike 我想要的是 10 而不是 1

标签: node.js promise settimeout


【解决方案1】:

您正在函数中解析a

delay(10).then(wait(a + 1)).then(deferred.resolve(a));

由于您的第一个函数调用是wait(1),所以a=1 并将结果解析为1

我稍微改了一下代码。

您可以在代码中看到,您可以访问您放入.then 的函数中的解析值。您应该使用该值,而不是原来的 a

var Q = require("q");

function delay(ms) {
  var deferred = Q.defer();
  setTimeout(deferred.resolve, ms);
  return deferred.promise;
}


function wait(a) {
  var deferred = Q.defer();
  if (a >= 10) {
    deferred.resolve(a);
  } else {
    console.log("wait " + a);
    delay(10).then(function () {
        return wait(a + 1);
    }).then(function (data) {
        deferred.resolve(data);
    });
  }

  return deferred.promise;
}

wait(1).then(console.log); // what I want is 10 instead of 1

【讨论】:

  • @roger 我刚刚更新了我的答案,请再次检查。
【解决方案2】:

你只需要包装你的延迟'then'函数来解决'write()'函数的promise。您目前正在解决您的“延迟()”功能的承诺,而不是您的“等待()”功能,这是未定义的。你的原始代码实际上解决了对参数“a”的承诺,这是一个。

(我也将大于比较改为'>=')

var Q = require("q");

function delay(ms) {
  var deferred = Q.defer();
  setTimeout(deferred.resolve, ms);
  return deferred.promise;
}

function wait(a) {
  var deferred = Q.defer();
  if (a >= 10) {
    deferred.resolve(a);
  } else {
    console.log("wait " + a);

    // Resolve the promise from 'wait()' not 'delay()'
    // Promise resolution takes a function as a parameter and passes 
    // its resolution value as a parameter to that function.
    //
    // This logic resolves various promises in a stack. This logic
    // makes the final promise resolve when the terminating condition
    // 'a >= 10' is satisfied, and is returned to the original call.
    delay(10).then(wait(a + 1).then(function(result){deferred.resolve(result)});
  }

  return deferred.promise;
}

wait(1).then(console.log); // Result is automatically passed in as a parameter to 'console.log()'

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 2018-05-17
    • 2015-03-08
    • 2017-11-24
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多