javascript - 难以包装 javascript 行为并将其保留以备后用

标签 javascript promise q

我正在使用 javascript 进行编程并使用 Promises,现在正在使用 Q.js。我终于明白了自己在做什么,但在特定行为上遇到了困难。

我有一种情况,我将相当相似的代码重复了几次。它基本上是这样的......

{
   // start
   var deferred = Q.defer();

   // do something {
      deferred.resolve();
   }

   return deferred.promise;
}

好吧,这一切都很好,但每次都重复所有这一切让人很烦,所以我试图把它包起来。这只是一个示例,它不是整个 javascript 文件,因为大多数其他部分都不相关。

{
   var list = [];
   queue = function(f) {
      var deferred = Q.defer();
      list.push(f(deferred));
      return deferred.promise;
   }

   {
      queue(function(deferred){
         // do some work
         // we want the deferred here so we can resolve it at the correct time
         deferred.resolve();
      });
   }
}

问题是我不希望它在我排队时立即运行。我基本上想构建列表,然后再运行它。我正在使用 Q.js

中的 reduce 函数运行列表
{
   return list.reduce(function(i, f) {
      return i.then(f);
   }, Q());
}

但这有点违背我的目标,因为我真的不打算在它们排队的同时运行它们。有没有一种方法可以保存执行以备后用,并且仍然通过函数传递延迟的对象?

更新

我被问到我期望代码做什么,这是一个公平的问题。我会尽力解释。这样做的目的是拆分逻辑,因为我使用的是 ASP.NET MVC,所以我有 _Layout 页面,然后是普通 View - 所以有这样的逻辑在其他事情完成之前不能运行,但有时是在每页的基础上。这种方法就是为了解决这个问题而设计的。

基本上它是这样工作的......

加载器.js

由于缺乏更好的术语或当前的实现,这是一个全局对象。我计划最终改变这一点,但一步一步来。

{
   var Loader = {};
   var list = [];

   initialize = function() {
      Q().then(step1).then(step2).then(process).then(finalStep);
   };

   queue = function(f) {
      // push the given function to the list
   };

   process = function() {
      return list.reduce(function(i,f){ 
         return i.then(f);
      }, Q());
   };

   step1 = function() { // generic example
      // create a promise
      return deferred.promise;
   }; // other steps are similar to this.

   return Loader;
}

_布局

<head>
   @RenderSection("scripts", false)
   <script type="text/javascript">
      // we have the loader object already
      Loader.initialize();
   </script>
</head>

索引

@section Scripts {
   <script type="text/javascript">
      Loader.promise(function(deferred){
         // do something here.
         deferred.resolve();
      }));
   </script>
}

最佳答案

你可以使用闭包。

queue(function(deferred) {
    return function() {
        // this is the actual function that will be run,
        // but it will have access to the deferred variable
        deferred.resolve();
    };
});

关于javascript - 难以包装 javascript 行为并将其保留以备后用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639189/

相关文章:

javascript - PHP-打印没有 url 和日期的页面

javascript - 您如何为针对 ORM 的分页定义中继连接?

javascript - 如何 promise 这段 Mongoose 代码?

javascript - 既然我们有 ES6 promise ,还有理由使用 Q 或 BlueBird 之类的 promise 库吗?

javascript - 跟随鼠标移动时背景放大不正确

javascript - Sequelize.js 包括返回不正确的数据

javascript - 处理获取响应的正确方法是什么

javascript - 创建 Q Promise 并稍后调用它

Java - 按数字和字母分割字符串

node.js - 链接 promise