当前位置: 首页 > 面试题库 >

Node.js / Q:连锁承诺依序

冯俊英
2023-03-14
问题内容

我想做一些非常简单的事情,但是我一点都不懂…

var Q = require('q');

var funcs = ["first", "second", "third", "fourth"];

function main(){

// really don't know how to chain sequentially here ...
    var result = Q();

    funcs.forEach(function (f) {
        result = treat(f).then(f);
    });

}

function treat(t){

    var deferred = Q.defer();

    setTimeout(function(){
        deferred.resolve("treated "+ t); 
    },2000);

    return deferred.promise;
}

main();

我希望依次对funcs数组的每个元素进行“处理”,然后输出如下所示:

treated first
//2 seconds later
treated second
//2 seconds later
treated third
//2 seconds later
treated fourth

我无法做到这一点:(应该很简单,我什么都没发现:(


问题答案:

从您的示例来看,我认为您已经看到了Q自述文件中的Sequences部分,但未能理解它。

当每个函数的输出作为输入传递给下一个函数时,原始示例使用“瀑布”模型:

var funcs = [foo, bar, baz, qux];

var result = Q(initialVal);
funcs.forEach(function (f) {
    result = result.then(f);
});
return result;

但是您只想按顺序执行我们所有的函数,因此您只需将每个函数与其变量绑定即可:

var args = ["first", "second", "third", "fourth"];

var result = Q();
args.forEach(function (t) {
    result = result.then(treat.bind(null, t));
});
return result;

在我的示例中,treat函数将被顺序调用4次,并且resultpromise将使用最新treat调用的值来解决(所有先前调用的结果都将被忽略)。

诀窍是该.then方法接受一个处理程序,该处理程序将在当前promise解析后返回新的promise进行调用。因此,您应该传递给.then函数,该函数应在执行链的下一步中调用。treat.bind(null, t)treat函数与属性绑定t。换句话说,它返回一个新函数,它将调用treatt作为其第一个参数传递。



 类似资料:
  • 问题内容: 这是一些基于行为的简单问题,我在下面的示例中在节点上运行时注意到了这些行为: 输出为: 1)为什么要实现在立即对已知值运行回调之前等待?为什么不够智能,以至于第一行在第二行运行之前同步发布其输出? 2)什么是之间的时间流逝和被输出?它是单个进程滴答吗? 3)能否将绩效深深包裹在承诺中而产生绩效问题?例如,即使可以有效地同步解决,它是否也要异步等待3倍的时间才能完成? 问题答案: 这实际

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我而言,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有道理。通过附加到该承诺链,每个人都暗示

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我来说,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有意义。通过附加到这个承诺链,每个人都暗

  • 问题内容: 据我了解,有三种调用异步代码的方法: 活动,例如 回调,例如 承诺 我找到了节点承诺库,但是我不明白。 有人可以解释什么是诺言,为什么我要使用它? 另外,为什么将它从Node.js中删除? 问题答案: node.js中的承诺承诺会做一些工作,然后有单独的回调,将为成功和失败以及处理超时而执行。在node.js中考虑promise的另一种方式是,它们是可能仅发射两个事件的发射器:成功和错

  • 问题内容: 我正在使用promis模块从请求模块返回我的json数据,但是每次运行它时,它都会为我提供此信息。 我无法正常工作,有人知道这个问题吗?这是我的代码: 问题答案: 许诺是充当未来价值的占位符的对象。您的函数返回该Promise对象。通过将处理程序附加到promise,您可以在promise中获得未来的价值: 这是异步代码,因此,仅能通过处理程序来获得承诺的价值。 修改清单: 在返回的p

  • 问题内容: 我有一个整数id的数组,例如 并且我需要为每个ID执行异步远程调用。每个调用都是一个使用$ resource执行的WebAPI请求,并显示为Promise。 我需要创建一个接受这些ID数组的函数,然后初始化递归承诺链。该链应导致对每个ID依次进行webapi调用。这些调用不应并行,而应链接在一起。 有问题的函数返回自己一个“主要”的承诺,该承诺应根据异步Web调用的结果来解决或拒绝。也