【问题标题】:local variables loaded asynchronously with chained Q promises使用链式 Q 承诺异步加载的局部变量
【发布时间】:2016-03-16 19:07:43
【问题描述】:

我有一个疑问.. 如果我在承诺的 .then() 之前定义变量,我可以在 .then() 中使用它们,对吗?回调不是这样,但它应该使用q 承诺。

为了确定这一点,我询问以下代码是否正确,即使在多个请求的情况下也是如此。

所以第二个.then()arg2 总是正确的,而不是最后一次调用myapp() 的arg2

function myapp()
{
    var arg1=1;
    var arg2=undefined;  // loaded async
    var arg3=undefined;  // loaded async

    call_promise(arg1)
          .then(function(data)
               {
                 arg2 = data;
               })
         .then(function()
              {
               arg3 = call_function(arg2);
               console.log(arg3);
              })
         .catch(function(err){});
}

【问题讨论】:

  • 它也适用于非承诺回调。
  • @Joe mmh 也许不是,但谢谢你,这是一个有趣的讲座。阅读以这种简单方式解释的一些理论总是很好
  • 只是说,this is a horrible pattern :-)
  • :P 是的,我也不喜欢它,正如@thefourtheye 所建议的那样,使用返回要好得多。感谢您提供解释链接

标签: javascript promise q


【解决方案1】:

是的,这会起作用。无论函数被调用多少次,都会在函数中创建新的变量。由于闭包属性,传递给then 处理程序的函数仍然可以访问arg2arg3

但是,这样做的正确方法是,通过返回值来解决 then 处理程序返回的承诺,就像这样

function myapp() {
    var arg1 = 1;
    return call_promise(arg1)
        .then(function(data) {
            return data;
        }).then(function(arg2) {
            console.log(call_function(arg2));
        }).catch(function(err) {});
}

【讨论】:

  • ……还有.then(function(data) { return data; })可以完全省略。
  • @Bergi 没错,但这就是答案的重点:D 从then 处理程序返回值
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2017-08-12
  • 2017-05-30
  • 2017-10-22
相关资源
最近更新 更多